firebase-tools: 7.0.2
Plataforma: Oracle Linux Server 7.6, Nó 10.15
emule a função https com "firebase-admin": "^ 8.2.0", "firebase-functions": "^ 3.0.2"
execute qualquer função https com funções do firebase
sem erros (firebase-tools 7.0.0 não gera erros)
Pedido enviado para funcionar.
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.
Postagem relevante sobre stackoverflow: https://stackoverflow.com/questions/56789424/the-incoming-json-object-does-not-contain-a-client-email-field
@noelmansour obrigado, então parece que algo entre 7.0.1
e 7.0.2
causou isso, irei dar uma olhada nas mudanças feitas.
Também estou enfrentando esse problema desde 7.0.2
Acabei de atualizar para 7.0.2, vendo isso também. Verifiquei as credenciais da minha conta e o campo client_email
está presente.
Alguém poderia compartilhar o código de uma função que está tentando executar no emulador que falha com este erro? Quanto mais simples, melhor.
@samtstern O seguinte código falha para mim:
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'));
});
Só funciona se eu definir uma conta de serviço ao chamar admin.initializeApp()
:
// this works
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
@wceolin obrigado por isso! Você pode executar o seguinte dentro do seu diretório de funções?
$ npm list @google-cloud/firestore
Este é o meu resultado (e tudo funciona para mim):
functions@ /tmp/tmp.ZkMEM0XGPF/functions
└─┬ [email protected]
└── @google-cloud/[email protected]
Obtive o mesmo resultado: 🤔
Portanto, estou percorrendo o caminho até o rastreamento de pilha de erros e nesta função:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141
Temos esta ramificação:
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;
}
No meu código opts.sslCreds
é definido, então eu acerto este branch:
if (opts.sslCreds) {
return opts.sslCreds;
}
É o outro ramo que tenta reunir credenciais e causa problemas. Agora preciso descobrir por que meu código segue para um lado e o seu para outro.
@wceolin você poderia acessar sua pasta node_modules
e editar este arquivo functions/node_modules/google-gax/build/src/grpc.js
para ter um console.log()
que imprime o objeto options
em createStub
function e me diga o que você viu?
Obrigado por sua ajuda até agora!
@samtstern Não tenho certeza se isso ajuda, mas fiz vários ajustes em meu package.json e node_modules no fim de semana. Não tenho mais esse problema no 7.0.2.
A saída npm list @google-cloud/firestore
corresponde à sua.
Eu destruí meu diretório node_modules no fim de semana, então me pergunto se isso está relacionado.
@noelmansour obrigado por essa nota, explica por que não consigo reproduzir em uma configuração limpa.
@noelmansour Eu também tentei deletar meu node_modules
, yarn.lock
, removendo dependências, mas não funcionou para mim. Vou tentar criar um projeto do zero para ver o que acontece.
@noelmansour isto é o que obtive do objeto 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 obrigado, isso é extremamente útil porque é assim que o meu se parece (e como deveria ser):
{
"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"
]
}
Como você pode ver, seu cliente ainda está tentando acessar a produção e depois falha porque o emulador de funções não está autorizado a fazê-lo.
Você também está executando o emulador Firestore? O seu objetivo é gravar no emulador do firestore ou você realmente deseja gravar no firestore de produção?
AH, FINALMENTE CONSEGUI REPRODUZIR ISTO! Se eu executar firebase emulators:start --only functions
então tento escrever para o Firestore e obtenho este erro.
Eu vejo esta mensagem de registro:
⚠ The Cloud Firestore emulator is not running so database operations will fail with a 'default credentials' error.
O que não é mais exatamente correto (o erro é sobre client_email), mas a detecção ainda está correta. As outras pessoas aqui também veem esse aviso?
Aqui estão mais algumas informações que podem ajudar. No fim de semana, eu também defini explicitamente a variável env do emulador firestore em meu .zshrc:
export FIRESTORE_EMULATOR_HOST="localhost:8080"
Quando o removo, recebo o erro. E isso é com o comando firebase emulators:start
@noelmansour você pode executar esse comando com --debug
e anexar os logs aqui como um arquivo txt
?
@samtstern às vezes eu estava usando o emulador para servir uma função HTTP localmente que define alguns dados em produção (geralmente para fazer alguma migração de dados). Estou a usar:
firebase serve --only functions --project myProjectAlias
Não tenho certeza se deveria funcionar assim (permitindo-nos gravar dados para produção), mas costumava funcionar. 😅
@wceolin não deveria funcionar assim com apenas initializeApp()
nas versões posteriores a 6.8.0
. Eu também tenho esse caso de uso, mas queremos encontrar uma maneira de fazer essa opção para que o padrão seja proteger a produção.
Mas fico feliz em saber de onde vem esse erro agora!
@samtstern Apenas para confirmar, execute firebase emulators:start --debug
com FIRESTORE_EMULATOR_HOST
não definido, correto?
Corrigir!
Na segunda-feira, 1º de julho de 2019, 12h28, Noel Mansour [email protected] escreveu:
@samtstern https://github.com/samtstern Apenas para confirmar, execute o firebase
emuladores: start --debug com FIRESTORE_EMULATOR_HOST não definido, correto?-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODY7DO2Q#issuecomment-507393898 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.
Aqui está.
Para sua informação, removi o ID do projeto desta linha (não acho que isso importa):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig
Também vale a pena mencionar que, sem exportar a variável env, [email protected] me dá este erro:
⚠ 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.
Obrigado @noelmansour por esses logs. Você se importaria de mostrar seu código de funções também?
É um pouco complicado porque prefiro não compartilhar todas as minhas funções e não tenho tempo agora para verificar se isso isoladamente reproduzirá o erro, mas aqui está a função hello que estou executando:
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 obrigado! Isso acabou de revelar um bug para mim. Essas duas coisas devem ser idênticas, mas não são:
Opção 1
admin.initializeApp();
const firestore = admin.firestore();
opção 2
const app = admin.initializeApp();
const firestore = app.firestore();
Sim, isso consertou para mim. Obrigado!
Também estou tendo o erro Error: The incoming JSON object does not contain a client_email field
. Não foi possível consertar.
Código padrão:
import { initializeApp } from 'firebase-admin';
// Initiate Firebase app
export const app = initializeApp();
export const db = app.firestore();
export const auth = app.auth();
Outra tentativa:
import { initializeApp, firestore, auth as defAuth } from 'firebase-admin';
// Initiate Firebase app
export const app = initializeApp();
export const db = firestore();
export const auth = defAuth();
Outra tentativa:
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 que comando você está usando para rodar os emuladores? Você pode mostrar o comando e os logs de sua execução com o sinalizador --debug
?
_Aviso: não tenho certeza de como meu problema estava relacionado a este aqui, mas pelo menos posso deixar minhas informações aqui, pois pode ajudar alguns de vocês._
Eu tive o mesmo em uma função firebase que tenta atualizar algum documento no banco de dados Firestore em lote. (Não testei sem lote).
Esta é a pilha de chamadas:
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"
}
}
Eu estava executando minha função localmente usando a linha de comando:
firebase functions:shell
Eu estava usando este código:
// 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));
Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });
e agora pude chamar minha função localmente usando:
firebase functions:shell
firebase > myCallableFirebaseFunction({from: "foo", to: "bar"})
Consulte os documentos de admin.credential.applicationDefault ()
@samtstern
concurrently --kill-others 'GOOGLE_APPLICATION_CREDENTIALS=service-account.json firebase serve --only functions' 'tsc --project ./ --watch'
Em relação aos logs, não pode ser hoje, sinto muito por isso!
Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });
Isso funcionou para mim. Estou executando funções localmente via:
firebase serve --only functions
Não está claro para mim se isso é seguro para produção. A partir dos documentos, parece que daria acesso de administrador ao código em execução na produção, mas isso é verdade de qualquer maneira.
@ ralphsmith80 aah você provavelmente está certo:
Encontrar credenciais automaticamente
As bibliotecas de cliente do GCP usam uma estratégia chamada Application Default Credentials (ADC) para encontrar as credenciais do seu aplicativo. Quando seu código usa uma biblioteca cliente, a estratégia verifica suas credenciais na seguinte ordem:
Primeiro, o ADC verifica se a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS está definida. Se a variável for definida, o ADC usará o arquivo de conta de serviço para o qual a variável aponta. A próxima seção descreve como definir a variável de ambiente.
Se a variável de ambiente não for definida, o ADC usará a conta de serviço padrão fornecida pelo Compute Engine, Kubernetes Engine, App Engine e Cloud Functions para aplicativos executados nesses serviços.
Se o ADC não puder usar nenhuma das credenciais acima, ocorrerá um erro.
Essa estratégia é útil ao testar e experimentar, mas pode dificultar saber quais credenciais seu aplicativo está usando.
Fonte: https://cloud.google.com/docs/authentication/production
Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });
Esse método cria um erro totalmente novo para mim.
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)
Também estou inicializando a loja conforme você declarou em # 1454
admin.initializeApp();
const db = admin.firestore();
Com a credencial adicionada a initializeApp
, recebo o erro acima.
Sem ele, ainda estou conseguindo;
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)
Estou recebendo o mesmo erro em um tutorial básico (o tutorial é de junho de 2019), então esse erro parece muito novo ...
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);
});
});
Quando executo o endpoint no Postman, recebo a mensagem de erro
"erro": "oops, algo deu errado"
Com o console informando:
Funções: Iniciando a execução de "createScream"
Erro: o objeto JSON de entrada não contém um campo client_email
O tutorial é do FreeCodeCamp - https://www.youtube.com/watch?v=m_u6P5k0vP0
Firebase Console> Configurações (ícone de engrenagem)> Usuários e permissões> Contas de serviço
Gere uma nova chave.
Adicione json à pasta do projeto.
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"
});
O arquivo json da conta de serviço disponibiliza os serviços e recursos do Firebase para o seu projeto.
Deve ser sempre privado. Incluir arquivo em .gitignore
Firebase Console> Configurações (ícone de engrenagem)> Usuários e permissões> Contas de serviço
Gere uma nova chave.
Adicione json à pasta do projeto.
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" });
O arquivo json da conta de serviço disponibiliza os serviços e recursos do Firebase para o seu projeto.
Deve ser sempre privado. Incluir arquivo em .gitignore
Obrigado phtn, obrigado - segui suas instruções, mas agora recebo o erro
Error: Error occurred while parsing your function triggers.
Estranhamente, quando executo o 'firebase deploy', tudo está funcionando: ' https: //europe-west1-myapp.cloudfunctions.net/api / ... - apenas NÃO no localhost?
Uma combinação dessas duas respostas funcionou! Obrigado novamente por ajudar.
serviceAccountKey.json deve estar no diretório /functions
.
o firebase deploy --only functions
reclamará se estiver fora.
Obrigado novamente (por ser tão paciente!). Meu serviceAccountKey.json está na pasta / functions (veja captura de tela no link abaixo).
Parece que há três maneiras de initilizeApp ... Tentei todos os três individualmente e nenhum deles parece funcionar - tenho a sensação de que isso vai ser algo muito simples que estou perdendo.
D
Captura de tela:
Estamos tendo o mesmo problema do nosso lado. Estamos inicializando o Firebase neste modelo:
const firebaseInstance = admin.initializeApp ()
const firestoreInstance = firebaseInstance.firestore ()
Deixe-me saber se podemos fornecer algo para ajudar a rastrear isso.
Todos neste tópico. Descobrimos uma solução. Fizemos downgrade de firebase-tools de 7.0.2 para 7.0.1 e recebemos um erro totalmente diferente (algo sobre não ser capaz de carregar as credenciais padrão).
Então, continuamos executando:
gcloud auth application-default login
Isso resolveu nosso problema
@ryanhornberger, você pode contornar seu problema fazendo:
const firebaseInstance = admin.initializeApp()
const firestoreInstance = admin.firestore() // I changed this line
Eu tenho uma correção para isso vindo em # 1459
@samtstern obrigado!
Todos neste tópico. Descobrimos uma solução. Fizemos downgrade de firebase-tools de 7.0.2 para 7.0.1 e recebemos um erro totalmente diferente (algo sobre não ser capaz de carregar as credenciais padrão).
Então, continuamos executando:
gcloud auth application-default login
Isso resolveu nosso problema
Isso funciona para mim. Eu inicialmente atualizei firebase-tools para 7.1, recebo o 'mesmo erro' quando executo 'firebase serve' em meu local. No entanto, está funcionando bem se eu implantar no firebase. O downgrade para 7.0.1 funciona para mim na minha localidade.
Mesmo problema com 7.1
Estamos trabalhando em uma correção, mas ainda não está pronto:
https://github.com/firebase/firebase-tools/pull/1479
Estou preso com isso, por favor, alguma saída?
o downgrade para 7.0.1 não ajudou para mim
Uma correção para isso foi incorporada ao # 1479 e será incluída na próxima versão (então 7.2.0
)
Ei @samtstern , não tenho certeza se é algo que estou fazendo incorretamente, ou talvez alguns novos problemas, mas notei algumas coisas executando as ferramentas do master mais recente (dad143c42445056014f6f48cc9dfa13156e3c186).
Primeiro, recebo o seguinte aviso ao executar firebase emulators:exec "npm run test"
:
⚠ The Cloud Firestore emulator is not running, so calls to Firestore will affect production.
Mesmo que no início do comando, eu possa ver que ele inicia o emulador:
~/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
Na verdade, não está atualizando o banco de dados do firestore de produção. Talvez apenas um falso negativo?
O outro problema é que ainda estou recebendo o erro. Não configurei $GOOGLE_APPLICATION_CREDENTIALS
, mas de acordo com https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional já deve haver permissão suficiente para acessar apenas o firestore:
Os gatilhos do Cloud Firestore e do Realtime Database já têm credenciais suficientes e não exigem configuração adicional.
Estou inicializando o SDK do administrador sem nenhum parâmetro usando admin.initializeApp();
Talvez algo esteja fazendo incorretamente?
@noelmansour obrigado por relatar isso (e por tentar master
!) Você pode mostrar o código do seu arquivo de funções principais?
Quase com certeza um falso negativo, mas um importante que precisamos corrigir.
É mínimo, pois é apenas exportar de outros arquivos:
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";
Na verdade, parece ser um problema com minha configuração de teste. Ao executar firebase emulators:start
não vejo o aviso.
@noelmansour como são seus testes? Você também pode registrar um novo problema para discutir isso, para que não enviemos spam para todos neste tópico>
Sim, claro. Me desculpe. # 1530 aberto
Todos neste tópico. Descobrimos uma solução. Fizemos downgrade de firebase-tools de 7.0.2 para 7.0.1 e recebemos um erro totalmente diferente (algo sobre não ser capaz de carregar as credenciais padrão).
Então, continuamos executando:gcloud auth application-default login
Isso resolveu nosso problema
Isso funciona para mim. Eu inicialmente atualizei firebase-tools para 7.1, recebo o 'mesmo erro' quando executo 'firebase serve' em meu local. No entanto, está funcionando bem se eu implantar no firebase. O downgrade para 7.0.1 funciona para mim na minha localidade.
Você poderia dizer como fazer o downgrade da versão do Firebase? Minha versão atual é 7.0.2, então eu tentei instalar npm i [email protected] -g isso. mas ainda minha versão é 7.0.2. como fazer o downgrade pls help?
A correção completa para esse problema foi lançada em 7.2.0
:
npm install -g [email protected]
Se você ainda estiver enfrentando um bug semelhante nessa versão, abra um novo problema.
Tendo o mesmo problema com as funções do Firebase. Já tentei npm install -g [email protected] resultando no mesmo erro.
Tendo o mesmo problema com as funções do Firebase. Já tentei npm install -g [email protected] resultando no mesmo erro.
A seguinte solução funcionou para mim:
// 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"
})
});
Comentários muito úteis
_Aviso: não tenho certeza de como meu problema estava relacionado a este aqui, mas pelo menos posso deixar minhas informações aqui, pois pode ajudar alguns de vocês._
Eu tive o mesmo em uma função firebase que tenta atualizar algum documento no banco de dados Firestore em lote. (Não testei sem lote).
Esta é a pilha de chamadas:
Eu estava executando minha função localmente usando a linha de comando:
firebase functions:shell
Eu estava usando este código:
Eu mudei a linha
admin.initializeApp();
para
admin.initializeApp({ credential: admin.credential.applicationDefault() });
e agora pude chamar minha função localmente usando:
Consulte os documentos de admin.credential.applicationDefault ()