рдлрд╛рдпрд░рдмреЗрд╕-рдЯреВрд▓реНрд╕: 7.0.2
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо: рдУрд░реЗрдХрд▓ рд▓рд┐рдирдХреНрд╕ рд╕рд░реНрд╡рд░ 7.6, рдиреЛрдб 10.15
"рдлрд╛рдпрд░рдмреЗрд╕-рдПрдбрдорд┐рди" рдХреЗ рд╕рд╛рде https рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВ: "^ 8.2.0", "рдлрд╛рдпрд░рдмреЗрд╕-рдлрд╝рдВрдХреНрд╢рдВрд╕": "^ 3.0.2"
рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА https рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдВ
рдХреЛрдИ рддреНрд░реБрдЯрд┐ (рдлрд╛рдпрд░рдмреЗрд╕-рдЙрдкрдХрд░рдг 7.0.0 рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ)
рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЧрдпрд╛ред
firebase > тЪа Error: The incoming JSON object does not contain a client_email field
at JWT.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
at GoogleAuth.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
at GoogleAuth.getClient (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
at GrpcClient._getCredentials (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:107:40)
at GrpcClient.createStub (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:223:34)
at new FirestoreClient (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
at ClientPool.acquire (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
at ClientPool.run (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
at Firestore.request (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:957:33)
тЪа Your function was killed because it raised an unhandled error.
рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдкреЛрд╕реНрдЯ: https://stackoverflow.com/questions/56789424/the-incoming-json-object-does-not-contain-a-client-email-field
@noelmansour рдзрдиреНрдпрд╡рд╛рдж рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ 7.0.1
рдФрд░ 7.0.2
рдХрд╛рд░рдг рдРрд╕рд╛ рд╣реБрдЖ, рдореИрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦреВрдВрдЧрд╛ред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЖрддреА рд╣реИ: https://github.com/googleapis/google-auth-library-nodejs/issues/137
7.0.2 рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
рдмрд╕ 7.0.2 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕реЗ рднреА рджреЗрдЦрддреЗ рд╣реБрдПред рдореЗрд░реЗ рдЦрд╛рддреЗ рдХреА рд╕рд╛рдЦ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рдФрд░ client_email
рдлрд╝реАрд▓реНрдб рдореМрдЬреВрдж рд╣реИред
рдХреНрдпрд╛ рдХреЛрдИ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗ рдПрдореБрд▓реЗрдЯрд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ? рдмреЗрд╣рддрд░ рд╕рд░рд▓ рд╣реИред
@samtstern рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:
import * as admin from 'firebase-admin';
admin.initializeApp();
import * as functions from 'firebase-functions';
export const testFunction = functions.https.onRequest(async (req, res) => {
const request = await admin.firestore().doc('test/123').get();
return request.ref.set({ test: 'random' })
.then(() => res.send('ok!'))
.catch((err) => res.status(500).send('error'));
});
рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ admin.initializeApp()
рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ:
// this works
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
@wceolin рдЙрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ?
$ npm list @google-cloud/firestore
рдпрд╣ рдореЗрд░рд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ (рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ):
functions@ /tmp/tmp.ZkMEM0XGPF/functions
тФФтФАтФм [email protected]
тФФтФАтФА @google-cloud/[email protected]
рдореБрдЭреЗ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛::
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╢рд╛рдЦрд╛ рд╣реИ:
async _getCredentials(opts: ClientStubOptions) {
if (opts.sslCreds) {
return opts.sslCreds;
}
const grpc = this.grpc;
const sslCreds = grpc.credentials.createSsl();
const client = await this.auth.getClient();
const credentials = grpc.credentials.combineChannelCredentials(
sslCreds,
grpc.credentials.createFromGoogleCredential(client)
);
return credentials;
}
рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ opts.sslCreds
рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд╢рд╛рдЦрд╛ рдХреЛ рдорд╛рд░рд╛:
if (opts.sslCreds) {
return opts.sslCreds;
}
рдпрд╣ рджреВрд╕рд░реА рд╢рд╛рдЦрд╛ рд╣реИ рдЬреЛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИред рдЕрдм рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдХреЛрдб рдПрдХ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХрд╛ рджреВрд╕рд░рд╛ рд░рд╛рд╕реНрддрд╛ рдЬрд╛рддрд╛ рд╣реИред
@wceolin рдЖрдк рдЕрдкрдиреЗ рдореЗрдВ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ node_modules
рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдЗрд╕ рдлрд╝рд╛рдЗрд▓ functions/node_modules/google-gax/build/src/grpc.js
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ console.log()
рдХрд┐ рдкреНрд░рд┐рдВрдЯ options
рдореЗрдВ рд╡рд╕реНрддреБ createStub
рд╕рдорд╛рд░реЛрд╣ рдФрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рддреБрдо рдХреНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реЛ?
рдЕрдм рддрдХ рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
@samtstern рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдкрд░ рдЕрдкрдиреЗ package.json рдФрд░ node_modules рдХреЗ рд╕рд╛рде tweaking рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдерд╛ред рдореБрдЭреЗ рдЕрдм 7.0.2 рдкрд░ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
npm list @google-cloud/firestore
рдЖрдЙрдЯрдкреБрдЯ рдЖрдкрдХрд╛ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рдЕрдкрдиреЗ рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ nuked рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдЙрд╕ рдиреЛрдЯ рдХреЗ рд▓рд┐рдП @noelmansour рдзрдиреНрдпрд╡рд╛рдж, рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╕рд╛рдл рд╕реЗрдЯрдЕрдк рдореЗрдВ рдкреБрди: рдкреЗрд╢ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
@noelmansour рдореИрдВрдиреЗ рднреА рдЕрдкрдиреЗ node_modules
, yarn.lock
рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред
@noelmansour рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ options
рд╡рд╕реНрддреБ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ:
{
"clientConfig": {},
"port":443,
"servicePath":"firestore.googleapis.com",
"credentials":{},
"projectId":"my-test-project",
"firebaseVersion":"8.2.0",
"libName":"gccl",
"libVersion":"2.2.3 fire/8.2.0",
"scopes":[
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/datastore"
]
}
@wceolin рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореЗрд░рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рдФрд░ рдЗрд╕реЗ рдХреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП):
{
"clientConfig":{},
"port":8080,
"servicePath":"localhost",
"credentials":{},
"projectId":"fir-dumpster",
"firebaseVersion":"8.2.0",
"libName":"gccl",
"libVersion":"2.2.3 fire/8.2.0",
"service":"firestore.googleapis.com",
"sslCreds":{
"callCredentials": {}
},
"customHeaders":{
"Authorization":"Bearer owner"
},
"scopes":[
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/datastore"
]
}
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдЧреНрд░рд╛рд╣рдХ рдЕрднреА рднреА рдЙрддреНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдПрдореБрд▓реЗрдЯрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХреГрдд рдирд╣реАрдВ рд╣реИред
рдХреНрдпрд╛ рдЖрдк рднреА рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдПрдореБрд▓реЗрдЯрд░ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдкрдХрд╛ рд▓рдХреНрд╖реНрдп рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдПрдореБрд▓реЗрдЯрд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реИ рдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЛрдбрдХреНрд╢рди рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рдУрд╣, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдЦрддреНрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛! рдЕрдЧрд░ рдореИрдВ firebase emulators:start --only functions
рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
рдореИрдВ рдпрд╣ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рджреЗрдЦрддрд╛ рд╣реВрдВ:
тЪа The Cloud Firestore emulator is not running so database operations will fail with a 'default credentials' error.
рдЬреЛ рдЕрдм рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ (рддреНрд░реБрдЯрд┐ client_email рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ) рд▓реЗрдХрд┐рди рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрднреА рднреА рд╕рд╣реА рд╣реИред рдХреНрдпрд╛ рдЕрдиреНрдп рд▓реЛрдЧ рднреА рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ?
рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬреЛ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИред рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ .zshrc рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдПрдореБрд▓реЗрдЯрд░ env рд╡реИрд░рд┐рдПрдмрд▓ рднреА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдерд╛ред
export FIRESTORE_EMULATOR_HOST="localhost:8080"
рдЬрдм рдореИрдВ рдЗрд╕реЗ рд╣рдЯрд╛рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдФрд░ рдпрд╣ рдХрдорд╛рдВрдб firebase emulators:start
@noelmansour рдЖрдк --debug
рд╕рд╛рде рдЙрд╕ рдЖрджреЗрд╢ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реЙрдЧ рдХреЛ рдпрд╣рд╛рдБ txt
рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
@samststern рдХрднреА-рдХрднреА рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ HTTP рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдореБрд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:
firebase serve --only functions --project myProjectAlias
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ (рд╣рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред ЁЯШЕ
@wceolin рдпрд╣ рдЙрд╕ рдХреЗ рд╕рд╛рде рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдирдВрдЧреЗ initializeApp()
рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ 6.8.0
ред рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╣ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрд╕ рдСрдкреНрдЯ-рдЗрди рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрддреНрдкрд╛рджрди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реБрдИ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдЕрдм рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ рд╣реИ!
@samtstern рдХреЗрд╡рд▓ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, firebase emulators:start --debug
FIRESTORE_EMULATOR_HOST
рдирд╣реАрдВ рдЪрд▓рд╛рдПрдВ, рд╕рд╣реА?
рд╕рд╣реА рдмрд╛рдд!
рд╕реЛрдо, рдЬреБрд▓рд╛рдИ рез, реирежрез реп, резреи:реи, рдЕрдкрд░рд╛рд╣реНрди рдиреЛрдПрд▓ рдордВрд╕реВрд░ рд╕реВрдЪрдирд╛рдПрдБ @github.com рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ:
@samtstern https://github.com/samtstern рд╕рд┐рд░реНрдл рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╛рдпрд░рдмреЗрд╕ рдЪрд▓рд╛рдПрдВ
emulators: start --debug рдХреЗ рд╕рд╛рде FIRESTORE_EMULATOR_HOST рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рд╕рд╣реА рд╣реИ?-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLPJLGBA5CNFSM4H4GTWIWIHYH3H3H3H3H3H3H3H3H3H3&hl=hi&hl=hi
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
ред
рдпрд╣реА рдкрд░ рд╣реИред
FYI рдХрд░реЗрдВ рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рдЖрдИрдбреА рдХреЛ рдЗрд╕ рд▓рд╛рдЗрди рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ (рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ, env рдЪрд░ рдирд┐рд░реНрдпрд╛рдд рдХреЗ рдмрд┐рдирд╛, [email protected] рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:
тЪа Error: Getting metadata from plugin failed with error: Header field "authorization" must have only a single value
at Http2CallStream.call.on (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call.js:68:41)
at emitOne (events.js:121:20)
at Http2CallStream.emit (events.js:211:7)
at process.nextTick (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
at _combinedTickCallback (internal/process/next_tick.js:132:7)
at process._tickCallback (internal/process/next_tick.js:181:9)
тЪа Your function was killed because it raised an unhandled error.
рдЙрди рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @noelmansour ред рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рдХреЛрдб рднреА рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?
рдпрд╣ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреЛ рджреЛрд╣рд░рд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣реИрд▓реЛ рдлрд╝рдВрдХреНрд╢рди рдореИрдВ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ:
index.ts:
require('./common'); // this should always be first in this file
export * from './debug'
// other exports for other functions
common.ts:
import * as admin from 'firebase-admin';
export const app = admin.initializeApp();
debug.ts:
import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
import {app} from "./common";
export const hello = functions.https.onRequest(async (req, resp) => {
const firestore = app.firestore();
const users = await firestore.collection('users').get();
console.log('empty users collection? ' + users.empty);
resp.sendStatus(200);
});
package.json:
{
"name": "functions",
"scripts": {
"lint": "tslint --project tsconfig.json",
"build": "tsc",
"serve": "npm run build && firebase serve --only functions",
"shell": "npm run build && firebase functions:shell",
"emulators": "npm run build && firebase emulators:start",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "8"
},
"main": "lib/index.js",
"dependencies": {
"@google-cloud/tasks": "^1.1.0",
"@types/jsonwebtoken": "^8.3.2",
"@types/request-promise": "^4.1.42",
"firebase-admin": "^8.2.0",
"firebase-functions": "^3.0.2",
"request": "^2.88.0",
"request-promise": "^4.2.4"
},
"devDependencies": {
"tslint": "^5.12.0",
"typescript": "^3.2.2"
},
"private": true
}
@noelmansour рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдЧ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИред рдпреЗ рджреЛ рдЪреАрдЬреЗрдВ рд╕рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рд▓реЗрдХрд┐рди рдпреЗ рдирд╣реАрдВ рд╣реИрдВ:
рд╡рд┐рдХрд▓реНрдк 1
admin.initializeApp();
const firestore = admin.firestore();
рд╡рд┐рдХрд▓реНрдк 2
const app = admin.initializeApp();
const firestore = app.firestore();
рд╣рд╛рдБ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рддрдп рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!
рдореБрдЭреЗ Error: The incoming JSON object does not contain a client_email field
рддреНрд░реБрдЯрд┐ рднреА рд╣реЛ рд░рд╣реА рд╣реИред рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛ред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛрдб:
import { initializeApp } from 'firebase-admin';
// Initiate Firebase app
export const app = initializeApp();
export const db = app.firestore();
export const auth = app.auth();
рдПрдХ рдФрд░ рдкреНрд░рдпрд╛рд╕:
import { initializeApp, firestore, auth as defAuth } from 'firebase-admin';
// Initiate Firebase app
export const app = initializeApp();
export const db = firestore();
export const auth = defAuth();
рдПрдХ рдФрд░ рдкреНрд░рдпрд╛рд╕:
import * as admin from 'firebase-admin';
// Initiate Firebase app
export const app = admin.initializeApp();
export const db = admin.firestore();
export const auth = admin.auth();
@JFGHT рдПрдореБрд▓реЗрдЯрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд┐рд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдЖрдк --debug
рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдХрдорд╛рдВрдб рдФрд░ рд▓реЙрдЧ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ?
_ рдЕрд╕реНрд╡реАрдХрд░рдг: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣рд╛рдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереА, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдЕрдкрдиреА рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреА рдХреБрдЫ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред_
рдореИрдВ рдПрдХ рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдорд╛рди рдерд╛ рдЬреЛ рдмреИрдЪ рдореЗрдВ рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред (рдмреИрдЪ рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рдпрд╣ рдХреЙрд▓рд╕реНрдЯреИрдХ рд╣реИ:
Unhandled error Error: The incoming JSON object does not contain a client_email field
> at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
> at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
> at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
> at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
> at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
> at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
> at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
> at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
> at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
> at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)
RESPONSE RECEIVED FROM FUNCTION: 500, {
"error": {
"status": "INTERNAL",
"message": "INTERNAL"
}
}
рдореИрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛ рд░рд╣рд╛ рдерд╛:
firebase functions:shell
рдореИрдВ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛:
// Reference report in Firestore
const db = admin.firestore();
admin.initializeApp();
export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));
const batch = db.batch();
snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));
return batch.commit();
});
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));
рдореИрдВрдиреЗ рд▓рд╛рдЗрди рдмрджрд▓ рджреА
admin.initializeApp();
рд╕реЗрд╡рд╛
admin.initializeApp({ credential: admin.credential.applicationDefault() });
рдФрд░ рдЕрдм рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:
firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})
Admin.credential.applicationDefault () рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ
@samtstern
concurrently --kill-others 'GOOGLE_APPLICATION_CREDENTIALS=service-account.json firebase serve --only functions' 'tsc --project ./ --watch'
рд▓реЙрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдЬ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ!
рдореИрдВрдиреЗ рд▓рд╛рдЗрди рдмрджрд▓ рджреА
admin.initializeApp();
рд╕реЗрд╡рд╛
admin.initializeApp({ credential: admin.credential.applicationDefault() });
рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
firebase serve --only functions
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдбреЙрдХреНрд╕ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдХреЛрдб рддрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЪ рд╣реИ рд╡реИрд╕реЗ рднреАред
@ ralphsmith80 рдЖрд╣ рдЖрдк рд╢рд╛рдпрдж рд╕рд╣реА рд╣реИрдВ:
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдвреВрдБрдврдирд╛
GCP рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП Application Default Credentials (ADC) рдирд╛рдордХ рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдЬрдм рдЖрдкрдХрд╛ рдХреЛрдб рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд░рдгрдиреАрддрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд░рдо рдореЗрдВ рдЖрдкрдХреЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИ:
рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ GOOGLE_APPLICATION_CREDENTIALS рд╕реЗрдЯ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, ADC рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЪрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ ADC рдЙрд╕ рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЪрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рднрд╛рдЧ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ ADC рдЙрди рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдЬрди рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрдВрдкреНрдпреВрдЯ рдЗрдВрдЬрди, рдХреБрдмреЗрд░рдиреЗрдЯ рдЗрдВрдЬрди, рдРрдк рдЗрдВрдЬрди рдФрд░ рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ ADC рдЙрдкрд░реЛрдХреНрдд рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд░рдгрдиреАрддрд┐ рдЙрдкрдпреЛрдЧреА рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрддрд╛рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рди рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рд╕реНрд░реЛрдд: https://cloud.google.com/docs/authentication/production
рдореИрдВрдиреЗ рд▓рд╛рдЗрди рдмрджрд▓ рджреА
admin.initializeApp();
рд╕реЗрд╡рд╛
admin.initializeApp({ credential: admin.credential.applicationDefault() });
рдпрд╣ рд╡рд┐рдзрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рдирдИ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рдХрд░рддреА рд╣реИред
Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
at GoogleAuth.getApplicationDefaultAsync (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
at process._tickCallback (internal/process/next_tick.js:68:7)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ # 1454 рдореЗрдВ рдХрд╣рд╛ рдерд╛, рдореИрдВ рд╕реНрдЯреЛрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
admin.initializeApp();
const db = admin.firestore();
initializeApp
рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рдЕрднреА рднреА рдорд┐рд▓ рд░рд╣рд╛ рд╣реВрдВ;
Error: The incoming JSON object does not contain a client_email field
at JWT.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
at GoogleAuth.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
at GoogleAuth.getClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
at GrpcClient._getCredentials (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:107:40)
at GrpcClient.createStub (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:223:34)
at new FirestoreClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
at ClientPool.acquire (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
at ClientPool.run (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
at Firestore.readStream (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:995:26)
рдореИрдВ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ (рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЬреВрди 2019 рд╕реЗ рд╣реИ) рдкрд░ рдпрд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддреНрд░реБрдЯрд┐ рдмрд╣реБрдд рдирдИ рд▓рдЧрддреА рд╣реИ ...
INDEX.JS:
`` `рдХрд╛рдВрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдлрд╛рдпрд░рдмреЗрд╕-рдлрд╝рдВрдХреНрд╢рдВрд╕');
const admin = рдЖрд╡рд╢реНрдпрдХрддрд╛ ('рдлрд╛рдпрд░рдмреЗрд╕-рдПрдбрдорд┐рди');
admin.initializeApp ();
admin.firestore()
.collection('screams')
.add(newScream)
.then(doc => {
res.json({message: `document ${doc.id} created successfully`});
})
.catch(err => {
res.status(500).json({ error: 'oops, something went wrong'});
console.error(err);
});
});
рдЬрдм рдореИрдВ рдкреЛрд╕реНрдЯрдореИрди рдореЗрдВ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЧрд▓рдд рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИ
"рддреНрд░реБрдЯрд┐": "рдЙрдлрд╝, рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛"
рдХрдВрд╕реЛрд▓ рд╕реНрдЯреИрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде:
рдХрд╛рд░реНрдп: "createScream" рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд
рддреНрд░реБрдЯрд┐: рдЖрдиреЗ рд╡рд╛рд▓реА JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ client_email рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ FreeCodeCamp - https://www.youtube.com/watch?v=m_u6P5k0vP0 рд╕реЗ рд╣реИ
рдлрд╛рдпрд░рдмреЗрд╕ рдХрдВрд╕реЛрд▓> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдЧрд┐рдпрд░ рдЖрдЗрдХрди)> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЕрдиреБрдорддрд┐рдпрд╛рдВ> рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ
рдирдИ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред
рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ json рдЬреЛрдбрд╝реЗрдВред
var admin = require("firebase-admin");
var serviceAccount = require("path/to/serviceAccountKey.json");
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://lts-profile.firebaseio.com"
});
рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ json рдлрд╝рд╛рдЗрд▓ рдЖрдкрдХреА рдлрд╛рдпрд░рдмреЗрд╕ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреА рд╣реИред
рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд┐рдЬреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝рд╛рдЗрд▓ .gitignore рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
рдлрд╛рдпрд░рдмреЗрд╕ рдХрдВрд╕реЛрд▓> рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдЧрд┐рдпрд░ рдЖрдЗрдХрди)> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдЕрдиреБрдорддрд┐рдпрд╛рдВ> рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ
рдирдИ рдХреБрдВрдЬреА рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред
рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ json рдЬреЛрдбрд╝реЗрдВред
var admin = require("firebase-admin"); var serviceAccount = require("path/to/serviceAccountKey.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: "https://lts-profile.firebaseio.com" });
рд╕реЗрд╡рд╛ рдЦрд╛рддрд╛ json рдлрд╝рд╛рдЗрд▓ рдЖрдкрдХреА рдлрд╛рдпрд░рдмреЗрд╕ рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддреА рд╣реИред
рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд┐рдЬреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд╝рд╛рдЗрд▓ .gitignore рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
рдзрдиреНрдпрд╡рд╛рдж phtn, рд╕рд░рд╛рд╣рдирд╛ рдХреА - рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдм рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
Error: Error occurred while parsing your function triggers.
рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдЬрдм рдореИрдВ 'рдлрд╛рдпрд░рдмреЗрд╕ рддреИрдирд╛рдд' рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ: ' https: //europe-west1-myapp.cloudfunctions.net/api / ... - рдмрд╕ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдирд╣реАрдВ?
рдЗрди рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдХ рдХреЙрдореНрдмреЛ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛! рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред
serviceAccountKey.json /functions
рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
firebase deploy --only functions
рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рдкрд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ред
рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж (рдЗрддрдирд╛ рдзреИрд░реНрдп рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП!)ред рдореЗрд░реА serviceAccountKey.json / рдлрд╝рдВрдХреНрд╢рдВрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИ (рдиреАрдЪреЗ рд▓рд┐рдВрдХ рдкрд░ рд╕реНрдХреНрд░реАрди-рдкрдХрдбрд╝реЛ рджреЗрдЦреЗрдВ)ред
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ initilizeApp рдХреЗ рддреАрди рддрд░реАрдХреЗ рд╣реИрдВ ... рдореИрдВрдиреЗ рдЗрди рддреАрдиреЛрдВ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЖрдЬрд╝рдорд╛рдпрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╕рд░рд▓ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред
рдШ
рдЪрд┐рддреНрд░рдкрдЯ рдкрдХрдбрд╝рдирд╛:
рд╣рдо рдЕрдкрдиреЗ рдЕрдВрдд рдкрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рдЦ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рддрд╣рдд рдлрд╛рдпрд░рдмреЗрд╕ рдХреЛ рдЖрд░рдВрдн рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
const firebaseInstance = admin.initializeApp ()
const firestoreInstance = firebaseInstance.firestore ()
рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рд╣рд░ рдХреЛрдИред рд╣рдордиреЗ рдПрдХ рдЙрдкрд╛рдп рдЦреЛрдЬрд╛ред рд╣рдордиреЗ 7.0.2 рд╕реЗ 7.0.1 рддрдХ рдлрд╛рдпрд░рдмреЗрд╕-рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд┐рдП рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ (рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ) рдкреНрд░рд╛рдкреНрдд рдХреАред
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рджреМрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛:
gcloud auth application-default login
рдЗрд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рдореБрджреНрджрд╛ рдареАрдХ рд╣реЛ рдЧрдпрд╛
@ryanhornberger рдЖрдк рдЕрдкрдиреЗ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const firebaseInstance = admin.initializeApp()
const firestoreInstance = admin.firestore() // I changed this line
рдореЗрд░реЗ рдкрд╛рд╕ # 1459 рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рд╣реИ
@samststern рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!
рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рд╣рд░ рдХреЛрдИред рд╣рдордиреЗ рдПрдХ рдЙрдкрд╛рдп рдЦреЛрдЬрд╛ред рд╣рдордиреЗ 7.0.2 рд╕реЗ 7.0.1 рддрдХ рдлрд╛рдпрд░рдмреЗрд╕-рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд┐рдП рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ (рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ) рдкреНрд░рд╛рдкреНрдд рдХреАред
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рджреМрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛:
gcloud auth application-default login
рдЗрд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рдореБрджреНрджрд╛ рдареАрдХ рд╣реЛ рдЧрдпрд╛
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рдлрд╛рдпрд░рдмреЗрд╕-рдЯреВрд▓реНрд╕ рдХреЛ 7.1 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдерд╛, рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдореЗрдВ 'рдлрд╛рдпрд░рдмреЗрд╕ рд╕рд░реНрд╡рд┐рд╕' рдЪрд▓рд╛рдиреЗ рдкрд░ 'рд╡рд╣реА рддреНрд░реБрдЯрд┐' рдорд┐рд▓реАред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рдлрд╛рдпрд░рдмреЗрд╕ рдореЗрдВ рддреИрдирд╛рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реВрдБред рдбрд╛рдЙрдирдЧреНрд░реЗрдбреЗрдб 7.0.1 рдореЗрд░реЗ рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
7.1 рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛
рд╣рдо рдПрдХ рдлрд┐рдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ:
https://github.com/firebase/firebase-tools/pull/1479
рдореИрдВ рдЗрд╕ рдХреГрдкрдпрд╛ рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдБ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░?
рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 7.0.1 рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдорджрдж рдирд╣реАрдВ рдХреА
рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ # 1479 рдореЗрдВ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЗрд╕рд▓рд┐рдП 7.2.0
)
рдЕрд░реЗ @sststern , рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХреБрдЫ рдореИрдВ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдпрд╛ рд╢рд╛рдпрдж рдирдП рдореБрджреНрджреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд╡реАрдирддрдо рдорд╛рд╕реНрдЯрд░ рд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ (dad143c42445056014f6f48cc9nfa13156e3c186)ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЭреЗ firebase emulators:exec "npm run test"
рдЪрд▓рдиреЗ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓рддреА рд╣реИ:
тЪа The Cloud Firestore emulator is not running, so calls to Firestore will affect production.
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрдорд╛рдВрдб рдореЗрдВ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдореБрд▓реЗрдЯрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ:
~/d/s/functions тЭптЭптЭп firebase emulators:exec "npm run test" тЬШ 130
i Starting emulators: ["functions","firestore"]
тЬФ functions: Using node<strong i="12">@8</strong> from host.
тЬФ functions: Emulator started at http://localhost:5001
i firestore: Logging to firestore-debug.log
тЬФ firestore: Emulator started at http://localhost:8080
i firestore: For testing set FIRESTORE_EMULATOR_HOST=localhost:8080
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдбреАрдмреА рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╢рд╛рдпрдж рд╕рд┐рд░реНрдл рдПрдХ рдЭреВрдареА рдирдХрд╛рд░рд╛рддреНрдордХ?
рджреВрд╕рд░рд╛ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдореИрдВрдиреЗ $GOOGLE_APPLICATION_CREDENTIALS
рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрдорддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
рдХреНрд▓рд╛рдЙрдб рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдФрд░ рд░рд┐рдпрд▓рдЯрд╛рдЗрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреНрд░рд┐рдЧрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рд╣реИрдВ, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрдЕрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВ admin.initializeApp();
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд┐рдирд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ sdk рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╢рд╛рдпрдж рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?
@noelmansour рдХреЛ рдЗрд╕рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рдФрд░ master
!) рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рдВрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреЛрдб рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ?
рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЧрд▓рдд рдирдХрд╛рд░рд╛рддреНрдордХ, рд▓реЗрдХрд┐рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдХ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣ рдмрд╣реБрдд рдиреНрдпреВрдирддрдо рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ:
import * as admin from 'firebase-admin';
// this should happen before any function runs
admin.initializeApp();
export * from './authFunctions';
export * from './fitbit';
export * from './sleep'
export * from './scheduler';
export * from './debug'
export {scheduleFunction} from "./scheduler";
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИред firebase emulators:start
рдЪрд▓рдиреЗ рдкрд░ рдореБрдЭреЗ рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреАред
@noelmansour рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВ? рдЖрдк рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рднреА рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕ рд╕реВрддреНрд░ рдкрд░ рд╕рднреА рдХреЛ рд╕реНрдкреИрдо рди рдХрд░реЗрдВ>
рд╣рд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ред рдореИрдВ рдХреНрд╖рдорд╛рдкреНрд░рд╛рд░реНрдереА рд╣реВрдВред # 1530 рдЦреЛрд▓рд╛
рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рд╣рд░ рдХреЛрдИред рд╣рдордиреЗ рдПрдХ рдЙрдкрд╛рдп рдЦреЛрдЬрд╛ред рд╣рдордиреЗ 7.0.2 рд╕реЗ 7.0.1 рддрдХ рдлрд╛рдпрд░рдмреЗрд╕-рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд┐рдП рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддреНрд░реБрдЯрд┐ (рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ) рдкреНрд░рд╛рдкреНрдд рдХреАред
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рджреМрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛:gcloud auth application-default login
рдЗрд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рдореБрджреНрджрд╛ рдареАрдХ рд╣реЛ рдЧрдпрд╛
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рдлрд╛рдпрд░рдмреЗрд╕-рдЯреВрд▓реНрд╕ рдХреЛ 7.1 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдерд╛, рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдореЗрдВ 'рдлрд╛рдпрд░рдмреЗрд╕ рд╕рд░реНрд╡рд┐рд╕' рдЪрд▓рд╛рдиреЗ рдкрд░ 'рд╡рд╣реА рддреНрд░реБрдЯрд┐' рдорд┐рд▓реАред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рдлрд╛рдпрд░рдмреЗрд╕ рдореЗрдВ рддреИрдирд╛рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реВрдБред рдбрд╛рдЙрдирдЧреНрд░реЗрдбреЗрдб 7.0.1 рдореЗрд░реЗ рд╕реНрдерд╛рдиреАрдп рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╛рдпрд░рдмреЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХреИрд╕реЗ рдХрд░реЗрдВ? рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг 7.0.2 рд╣реИ рддреЛ рдореИрдВрдиреЗ npm i [email protected] -g рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг 7.0.2 рд╣реИред рдХреИрд╕реЗ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░реЗрдВ pls рдорджрдж?
рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдирд┐рд░реНрдзрд╛рд░рдг 7.2.0
рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
npm install -g [email protected]
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдПрдХ рд╕рдорд╛рди рдмрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдЦреЛрд▓реЗрдВред
Firebase рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА npm рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА
Firebase рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА npm рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:
// Create Firebase-adminsdk key
// Providing a service account object inline
admin.initializeApp({
credential: admin.credential.cert({
projectId: "<PROJECT_ID>",
clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com",
privateKey: "-----BEGIN PRIVATE KEY-----<KEY>-----END PRIVATE KEY-----\n"
})
});
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
_ рдЕрд╕реНрд╡реАрдХрд░рдг: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣рд╛рдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереА, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдЕрдкрдиреА рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреА рдХреБрдЫ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред_
рдореИрдВ рдПрдХ рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдорд╛рди рдерд╛ рдЬреЛ рдмреИрдЪ рдореЗрдВ рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред (рдмреИрдЪ рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рдпрд╣ рдХреЙрд▓рд╕реНрдЯреИрдХ рд╣реИ:
рдореИрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛ рд░рд╣рд╛ рдерд╛:
firebase functions:shell
рдореИрдВ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛:
рдореИрдВрдиреЗ рд▓рд╛рдЗрди рдмрджрд▓ рджреА
admin.initializeApp();
рд╕реЗрд╡рд╛
admin.initializeApp({ credential: admin.credential.applicationDefault() });
рдФрд░ рдЕрдм рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛:
Admin.credential.applicationDefault () рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ