Firebase-tools: "Erreur: l'objet JSON entrant ne contient pas de champ client_email" après la mise à niveau vers la version 7.0.2

Créé le 28 juin 2019  ·  61Commentaires  ·  Source: firebase/firebase-tools

[REQUIS] Informations sur l'environnement


outils firebase


Plate-forme: Oracle Linux Server 7.6, Node 10.15

[REQUIS] Scénario de test


émuler la fonction https avec "firebase-admin": "^ 8.2.0", "firebase-functions": "^ 3.0.2"

[OBLIGATOIRE] Étapes à suivre pour reproduire

exécutez n'importe quelle fonction https avec les fonctions Firebase

[OBLIGATOIRE] Comportement attendu

aucune erreur (firebase-tools 7.0.0 ne renvoie aucune erreur)

[OBLIGATOIRE] Comportement réel

Demande envoyée pour fonctionner.

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

Commentaire le plus utile

_Avertissement: je ne sais pas dans quelle mesure mon problème était lié à celui-ci ici, mais au moins je peux déposer mes informations ici car cela pourrait aider certains d'entre vous._

J'ai eu la même chose dans une fonction firebase qui essaie de mettre à jour un document dans la base de données Firestore par lots. (N'a pas testé sans lot).

Voici la pile d'appels:

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"
  }
}

J'exécutais ma fonction localement en utilisant la ligne de commande:
firebase functions:shell

J'utilisais ce code:

// 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));

J'ai changé la ligne
admin.initializeApp();
à
admin.initializeApp({ credential: admin.credential.applicationDefault() });
et maintenant j'ai pu appeler ma fonction localement en utilisant:

firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})

Voir la documentation pour admin.credential.applicationDefault ()

Tous les 61 commentaires

@noelmansour merci donc il semble que quelque chose entre 7.0.1 et 7.0.2 causé cela, je vais regarder les changements effectués.

Je rencontre également ce problème depuis la version 7.0.2

Je viens de passer à la version 7.0.2, voyant cela aussi. J'ai vérifié les informations d'identification de mon compte et le champ client_email est présent.

Quelqu'un pourrait-il partager le code d'une fonction qu'il essaie d'exécuter dans l'émulateur qui échoue avec cette erreur? Le plus simple sera le mieux.

@samtstern Le code suivant échoue pour moi:

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'));
});

Cela ne fonctionne que si je crée un compte de service en appelant admin.initializeApp() :

// this works
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

@wceolin merci pour ça! Pouvez-vous exécuter ce qui suit dans votre répertoire de fonctions?

$ npm list @google-cloud/firestore

Voici mon résultat (et tout fonctionne pour moi):

functions@ /tmp/tmp.ZkMEM0XGPF/functions
└─┬ [email protected]
  └── @google-cloud/[email protected]

J'ai eu le même résultat: 🤔

Screen Shot 2019-07-01 at 15 44 35

Je marche donc dans la trace de la pile d'erreur et dans cette fonction:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141

Nous avons cette ramification:

 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;
  }

Dans mon code opts.sslCreds est défini, j'ai donc frappé cette branche:

    if (opts.sslCreds) {
      return opts.sslCreds;
    }

C'est l'autre branche qui tente d'assembler les informations d'identification et pose des problèmes. Maintenant, j'ai besoin de comprendre pourquoi mon code va dans un sens et le vôtre dans un autre.

@wceolin pourriez-vous accéder à votre dossier node_modules et éditer ce fichier functions/node_modules/google-gax/build/src/grpc.js pour avoir un console.log() qui imprime l'objet options dans le createStub function et laissez-moi savoir ce que vous voyez?

Merci pour votre aide jusqu'à présent!

@samtstern Je ne sais pas si cela aide, mais j'ai fait un tas de peaufinages avec mon package.json et node_modules au cours du week-end. Je n'ai plus le problème sur 7.0.2.

La sortie npm list @google-cloud/firestore correspond à la vôtre.

J'ai bombardé mon répertoire node_modules pendant le week-end, donc je me demande si c'est lié.

@noelmansour merci pour cette note, explique pourquoi je ne peux pas reproduire dans une configuration propre.

@noelmansour J'ai aussi essayé de supprimer mes node_modules , yarn.lock , en supprimant les dépendances mais cela n'a pas fonctionné pour moi. Je vais essayer de créer un projet à partir de zéro pour voir ce qui se passe.

@noelmansour voici ce que j'ai obtenu de l'objet 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 merci, c'est extrêmement utile car voici à quoi ressemble le mien (et à quoi il devrait ressembler):

{
   "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"
   ]
}

Comme vous pouvez le voir, votre client essaie toujours d'accéder à la production, puis il échoue car l'émulateur de fonctions n'est pas autorisé à le faire.

Exécutez-vous également l'émulateur Firestore? Votre objectif est-il d'écrire dans l'émulateur Firestore ou voulez-vous réellement écrire dans le Firestore de production?

OH J'étais enfin capable de reproduire ça! Si j'exécute firebase emulators:start --only functions alors j'essaye d'écrire à Firestore, j'obtiens cette erreur.

Je vois ce message de journal:

⚠  The Cloud Firestore emulator is not running so database operations will fail with a 'default credentials' error.

Ce qui n'est plus tout à fait correct (l'erreur concerne client_email) mais la détection est toujours correcte. D'autres personnes ici voient-elles également cet avertissement?

Voici quelques informations supplémentaires qui peuvent vous aider. Au cours du week-end, j'avais également défini explicitement la variable env de l'émulateur Firestore dans mon .zshrc:

export FIRESTORE_EMULATOR_HOST="localhost:8080"

Lorsque je le supprime, j'obtiens l'erreur. Et c'est avec la commande firebase emulators:start

@noelmansour pouvez-vous exécuter cette commande avec --debug et attacher les journaux ici en tant que fichier txt ?

@samtstern parfois j'utilisais l'émulateur pour servir une fonction HTTP localement qui définit certaines données en production (généralement pour effectuer une migration de données). J'utilise:

firebase serve --only functions --project myProjectAlias

Je ne sais pas si cela devait fonctionner comme ça (nous permettant d'écrire des données en production) mais cela fonctionnait auparavant. 😅

@wceolin il n'était pas censé fonctionner comme ça avec initializeApp() dans les versions après 6.8.0 . J'ai également ce cas d'utilisation, mais nous voulons trouver un moyen de faire cet opt-in afin que la valeur par défaut soit de protéger la production.

Mais je suis heureux de savoir d'où vient cette erreur maintenant!

@samtstern Juste pour confirmer, lancez firebase emulators:start --debug avec FIRESTORE_EMULATOR_HOST non défini, correct?

Correct!

Le lundi 1 juillet 2019, 12 h 28, Noel Mansour [email protected] a écrit:

@samtstern https://github.com/samtstern Juste pour confirmer, lancez firebase
émulateurs: démarrez --debug avec FIRESTORE_EMULATOR_HOST non défini, correct?

-
Vous recevez cela parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVHWWK3TUL52HS4DFV98WWWWWK3TUL52HS4DFV5098WWWK3TUL52HS4DFV
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.

C'est ici.

Pour info, j'ai supprimé le project-id de cette ligne (ne pense pas que cela compte):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig

debug.txt

Il convient également de mentionner, sans exporter la variable env, [email protected] me donne cette erreur:

⚠  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.

Merci @noelmansour pour ces journaux. Cela vous dérangerait-il également d'afficher le code de vos fonctions?

C'est un peu délicat car je préfère ne pas partager toutes mes fonctions, et je n'ai pas le temps pour le moment de vérifier que, isolément, cela reprendra l'erreur, mais voici la fonction Hello que j'ai exécutée:

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 merci! Cela m'a révélé un bug. Ces deux choses devraient être identiques mais ne le sont pas:

Option 1

admin.initializeApp();
const firestore = admin.firestore();

Option 2

const app = admin.initializeApp();
const firestore = app.firestore();

Ouais, ça a réglé ça pour moi. Merci!

J'ai également l'erreur Error: The incoming JSON object does not contain a client_email field . Impossible de le réparer.

Code par défaut:

import { initializeApp } from 'firebase-admin';

// Initiate Firebase app
export const app = initializeApp();
export const db = app.firestore();
export const auth = app.auth();

Un autre essai:

import { initializeApp, firestore, auth as defAuth } from 'firebase-admin';

// Initiate Firebase app
export const app = initializeApp();
export const db = firestore();
export const auth = defAuth();

Un autre essai:

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 quelle commande utilisez-vous pour exécuter les émulateurs? Pouvez-vous afficher la commande et les journaux de son exécution avec l'indicateur --debug ?

_Avertissement: je ne sais pas dans quelle mesure mon problème était lié à celui-ci ici, mais au moins je peux déposer mes informations ici car cela pourrait aider certains d'entre vous._

J'ai eu la même chose dans une fonction firebase qui essaie de mettre à jour un document dans la base de données Firestore par lots. (N'a pas testé sans lot).

Voici la pile d'appels:

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"
  }
}

J'exécutais ma fonction localement en utilisant la ligne de commande:
firebase functions:shell

J'utilisais ce code:

// 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));

J'ai changé la ligne
admin.initializeApp();
à
admin.initializeApp({ credential: admin.credential.applicationDefault() });
et maintenant j'ai pu appeler ma fonction localement en utilisant:

firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})

Voir la documentation pour admin.credential.applicationDefault ()

@samtstern

concurrently --kill-others 'GOOGLE_APPLICATION_CREDENTIALS=service-account.json firebase serve --only functions' 'tsc --project ./ --watch'

Concernant les logs, ça ne peut pas être aujourd'hui, je suis désolé pour ça!

J'ai changé la ligne
admin.initializeApp();
à
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Cela a fonctionné pour moi. J'exécute des fonctions localement via:
firebase serve --only functions

Ce n'est pas clair pour moi si c'est sans danger pour la production. D'après la documentation, il semble que cela donnerait un accès administrateur au code en cours de production, mais c'est vrai de toute façon.

@ ralphsmith80 aah vous avez probablement raison:

Recherche automatique d'informations d'identification
Les bibliothèques clientes GCP utilisent une stratégie appelée Application Default Credentials (ADC) pour trouver les informations d'identification de votre application. Lorsque votre code utilise une bibliothèque cliente, la stratégie vérifie vos informations d'identification dans l'ordre suivant:

Tout d'abord, ADC vérifie si la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS est définie. Si la variable est définie, ADC utilise le fichier de compte de service vers lequel pointe la variable. La section suivante décrit comment définir la variable d'environnement.

Si la variable d'environnement n'est pas définie, ADC utilise le compte de service par défaut fourni par Compute Engine, Kubernetes Engine, App Engine et Cloud Functions, pour les applications qui s'exécutent sur ces services.

Si ADC ne peut utiliser aucune des informations d'identification ci-dessus, une erreur se produit.

Cette stratégie est utile lors des tests et des expérimentations, mais peut rendre difficile l'identification des informations d'identification utilisées par votre application.

Source: https://cloud.google.com/docs/authentication/production

J'ai changé la ligne
admin.initializeApp();
à
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Cette méthode crée une toute nouvelle erreur pour moi.

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)

J'initialise également le magasin comme vous l'avez indiqué dans # 1454

admin.initializeApp();
const db = admin.firestore(); 

Avec les informations d'identification ajoutées au initializeApp , j'obtiens l'erreur ci-dessus.
Sans cela, je reçois toujours;

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)

J'obtiens cette même erreur sur un didacticiel de base (le didacticiel date de juin 2019), donc cette erreur semble assez nouvelle ...

INDEX.JS:

`` `` const functions = require ('firebase-functions');
const admin = require ('firebase-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);
    });

});


Lorsque j'exécute le point de terminaison dans Postman, je reçois le message d'erreur

"error": "Oups, un problème est survenu"

Avec la console indiquant:

Fonctions: Début de l'exécution de "createScream"
Erreur: l'objet JSON entrant ne contient pas de champ client_email

Le didacticiel provient de FreeCodeCamp - https://www.youtube.com/watch?v=m_u6P5k0vP0

Firebase Console> Paramètres (icône d'engrenage)> Utilisateurs et autorisations> Comptes de service

Générez une nouvelle clé.

Ajoutez json à votre dossier de projet.

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"
});

Le fichier json du compte de service rend vos services et fonctionnalités Firebase disponibles pour votre projet.
Cela devrait toujours être privé. Inclure le fichier dans .gitignore

Firebase Console> Paramètres (icône d'engrenage)> Utilisateurs et autorisations> Comptes de service

Générez une nouvelle clé.

Ajoutez json à votre dossier de projet.

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"
});

Le fichier json du compte de service rend vos services et fonctionnalités Firebase disponibles pour votre projet.
Cela devrait toujours être privé. Inclure le fichier dans .gitignore


Merci phtn, apprécié - J'ai suivi vos instructions mais j'obtiens maintenant l'erreur

Error: Error occurred while parsing your function triggers.

Bizarrement, quand je lance 'firebase deploy', tout fonctionne sur: ' https: //europe-west1-myapp.cloudfunctions.net/api / ... - juste PAS sur localhost?

serviceAccountKey.json doit être dans le répertoire /functions .

le firebase deploy --only functions se plaindra s'il est à l'extérieur.

Merci encore (d'être si patient!). Mon serviceAccountKey.json est dans le dossier / functions (voir capture d'écran sur le lien ci-dessous).

Il semble qu'il existe trois façons d'initiliserApp ... J'ai essayé les trois individuellement et aucune d'entre elles ne semble fonctionner - j'ai le sentiment que cela va être quelque chose de fou et simple qui me manque.

Capture d'écran:
Screenshot 2019-07-10 at 09 22 32

Nous avons le même problème de notre côté. Nous initialisons Firebase sous ce modèle:

const firebaseInstance = admin.initializeApp ()
const firestoreInstance = firebaseInstance.firestore ()

Faites-moi savoir si nous pouvons fournir quelque chose pour aider à retracer cela.

Tout le monde sur ce fil. Nous avons découvert une solution. Nous avons rétrogradé firebase-tools de 7.0.2 à 7.0.1 et avons reçu une erreur entièrement différente (quelque chose concernant l'impossibilité de charger les informations d'identification par défaut).

Nous avons donc continué en exécutant:

gcloud auth application-default login

Cela a résolu notre problème

@ryanhornberger, vous pouvez contourner votre problème en faisant:

const firebaseInstance = admin.initializeApp()
const firestoreInstance = admin.firestore() // I changed this line

J'ai un correctif pour cela à venir dans # 1459

@samtstern merci!

Tout le monde sur ce fil. Nous avons découvert une solution. Nous avons rétrogradé firebase-tools de 7.0.2 à 7.0.1 et avons reçu une erreur entièrement différente (quelque chose concernant l'impossibilité de charger les informations d'identification par défaut).

Nous avons donc continué en exécutant:

gcloud auth application-default login

Cela a résolu notre problème

Cela fonctionne pour moi. J'ai initialement mis à niveau firebase-tools vers 7.1, j'ai eu la «même erreur» lorsque j'exécute «firebase serve» dans mon local. Cependant, cela fonctionne bien si j'ai déployé sur Firebase. Rétrogradé à 7.0.1 fonctionne pour moi dans ma section locale.

Même problème avec 7.1

Nous travaillons sur un correctif, mais ce n'est pas encore prêt:
https://github.com/firebase/firebase-tools/pull/1479

Je suis coincé avec ça s'il vous plait, une issue?

le passage à la version 7.0.1 ne m'a pas aidé

Un correctif a été fusionné dans # 1479 et sera inclus dans la prochaine version (donc 7.2.0 )

Hey @samtstern ,

Tout d'abord, j'obtiens l'avertissement suivant lors de l'exécution de firebase emulators:exec "npm run test" :

⚠ The Cloud Firestore emulator is not running, so calls to Firestore will affect production.

Même si plus tôt dans la commande, je peux voir que cela démarre l'émulateur:

~/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

Il ne s'agit pas en fait de mettre à jour la base de données du firestore de production. Peut-être juste un faux négatif?

L'autre problème est que j'obtiens toujours l'erreur. Je n'ai pas défini $GOOGLE_APPLICATION_CREDENTIALS , mais selon https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional, il devrait déjà y avoir une autorisation suffisante si vous n'accédez qu'à Firestore:

Les déclencheurs Cloud Firestore et Realtime Database disposent déjà d'informations d'identification suffisantes et ne nécessitent pas de configuration supplémentaire.

J'initialise le sdk d'administration sans aucun paramètre en utilisant admin.initializeApp(); Peut-être quelque chose que je fais mal?

@noelmansour merci d'avoir signalé cela (et d'avoir essayé master !) Pouvez-vous afficher le code de votre fichier de fonctions principales?

Presque certainement un faux négatif, mais un problème important que nous devons corriger.

C'est assez minime car il s'agit simplement d'exporter à partir d'autres fichiers:

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";

En fait, cela semble être un problème avec ma configuration de test. Lors de l'exécution de firebase emulators:start je ne vois pas l'avertissement.

@noelmansour à quoi ressemblent vos tests? Pourriez-vous également déposer un nouveau problème pour en discuter afin que nous ne spammions pas tout le monde sur ce fil>

Oui bien sûr. Mes excuses. # 1530 ouvert

Tout le monde sur ce fil. Nous avons découvert une solution. Nous avons rétrogradé firebase-tools de 7.0.2 à 7.0.1 et avons reçu une erreur entièrement différente (quelque chose concernant l'impossibilité de charger les informations d'identification par défaut).
Nous avons donc continué en exécutant:

gcloud auth application-default login

Cela a résolu notre problème

Cela fonctionne pour moi. J'ai initialement mis à niveau firebase-tools vers 7.1, j'ai eu la «même erreur» lorsque j'exécute «firebase serve» dans mon local. Cependant, cela fonctionne bien si j'ai déployé sur Firebase. Rétrogradé à 7.0.1 fonctionne pour moi dans ma section locale.

Pourriez-vous nous dire comment rétrograder la version Firebase? Ma version actuelle est 7.0.2 alors j'ai essayé d'installer npm i [email protected] -g this. mais ma version est toujours 7.0.2. comment rétrograder l'aide de pls?

Le correctif complet de ce problème a été publié dans 7.2.0 :

npm install -g [email protected]

Si vous rencontrez toujours un bogue similaire sur cette version, veuillez ouvrir un nouveau problème.

Avoir ce même problème avec les fonctions Firebase. Déjà essayé npm install -g [email protected] résultant de la même erreur.

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

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

Avoir ce même problème avec les fonctions Firebase. Déjà essayé npm install -g [email protected] résultant de la même erreur.

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

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

La solution suivante a fonctionné pour moi:

// 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"
    })
});
Cette page vous a été utile?
0 / 5 - 0 notes