Firebase-tools: "рддреНрд░реБрдЯрд┐: рдЖрдиреЗ рд╡рд╛рд▓реА JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ 7.0.2 рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ client_email рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ"

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдЬреВрди 2019  ┬╖  61рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: firebase/firebase-tools

[рдЖрд╡рд╢реНрдпрдХ] рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА


рдлрд╛рдпрд░рдмреЗрд╕-рдЯреВрд▓реНрд╕: 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.
emulator-suite functions bug

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

_ рдЕрд╕реНрд╡реАрдХрд░рдг: рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣рд╛рдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереА, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдЕрдкрдиреА рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреА рдХреБрдЫ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред_

рдореИрдВ рдПрдХ рдлрд╛рдпрд░рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдорд╛рди рдерд╛ рдЬреЛ рдмреИрдЪ рдореЗрдВ рдлрд╛рдпрд░рд╕реНрдЯрд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред (рдмреИрдЪ рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред

рдпрд╣ рдХреЙрд▓рд╕реНрдЯреИрдХ рд╣реИ:

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 () рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВ

рд╕рднреА 61 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдкреЛрд╕реНрдЯ: 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

https://github.com/googleapis/google-auth-library-nodejs/blob/37bb8c7cd0a6501103274284d9cddd6816cc881e/src/auth/jwtclient.ts#L253

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]

рдореБрдЭреЗ рд╡рд╣реА рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛::

Screen Shot 2019-07-01 at 15 44 35

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ:
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

debug.txt

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ, 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 / ... - рдмрд╕ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдирд╣реАрдВ?

рдЗрди рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдХ рдХреЙрдореНрдмреЛ рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛! рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред

https://stackoverflow.com/questions/44626919/where-is-or-what-is-the-serviceaccountkey-json-is-the-node-js-sample-of-firebase?rq=1

https://stackoverflow.com/questions/42176453/google-app-engine-node-cannot-find-module-firebase-admin/42634321#42634321

serviceAccountKey.json /functions рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

firebase deploy --only functions рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рдкрд░ рд╢рд┐рдХрд╛рдпрдд рдХрд░реЗрдЧрд╛ред

рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж (рдЗрддрдирд╛ рдзреИрд░реНрдп рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП!)ред рдореЗрд░реА serviceAccountKey.json / рдлрд╝рдВрдХреНрд╢рдВрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реИ (рдиреАрдЪреЗ рд▓рд┐рдВрдХ рдкрд░ рд╕реНрдХреНрд░реАрди-рдкрдХрдбрд╝реЛ рджреЗрдЦреЗрдВ)ред

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ initilizeApp рдХреЗ рддреАрди рддрд░реАрдХреЗ рд╣реИрдВ ... рдореИрдВрдиреЗ рдЗрди рддреАрдиреЛрдВ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЖрдЬрд╝рдорд╛рдпрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╕рд░рд▓ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

рдШ

рдЪрд┐рддреНрд░рдкрдЯ рдкрдХрдбрд╝рдирд╛:
Screenshot 2019-07-10 at 09 22 32

рд╣рдо рдЕрдкрдиреЗ рдЕрдВрдд рдкрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рдЦ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рддрд╣рдд рдлрд╛рдпрд░рдмреЗрд╕ рдХреЛ рдЖрд░рдВрдн рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

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 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА

Screen Shot 2019-12-12 at 4 23 57 AM

Screen Shot 2019-12-12 at 4 21 30 AM

Firebase рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА npm рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА

Screen Shot 2019-12-12 at 4 23 57 AM

Screen Shot 2019-12-12 at 4 21 30 AM

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:

// 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"
    })
});
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Symbolk picture Symbolk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

FluorescentHallucinogen picture FluorescentHallucinogen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

roosi picture roosi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

repentsinner picture repentsinner  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chwzr picture chwzr  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ