Firebase-tools: "Kesalahan: Objek JSON yang masuk tidak berisi bidang client_email" setelah meningkatkan ke 7.0.2

Dibuat pada 28 Jun 2019  ·  61Komentar  ·  Sumber: firebase/firebase-tools

[WAJIB] Info lingkungan


firebase-tools: 7.0.2


Platform: Oracle Linux Server 7.6, Node 10.15

[WAJIB] Kasus uji


meniru fungsi https dengan "firebase-admin": "^ 8.2.0", "firebase-functions": "^ 3.0.2"

[WAJIB] Langkah untuk mereproduksi

jalankan fungsi https apa pun dengan fungsi firebase

[REQUIRED] Perilaku yang diharapkan

tidak ada kesalahan (firebase-tools 7.0.0 tidak menampilkan kesalahan)

[REQUIRED] Perilaku sebenarnya

Mengirim permintaan untuk berfungsi.

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

Komentar yang paling membantu

_Penafian: tidak yakin seberapa terkait masalah saya dengan masalah ini di sini, tetapi setidaknya saya dapat memberikan info saya di sini karena mungkin dapat membantu sebagian dari Anda._

Saya memiliki hal yang sama dalam fungsi firebase yang mencoba memperbarui beberapa dokumen dalam database firestore secara batch. (Tidak menguji tanpa batch).

Ini adalah callstack:

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

Saya menjalankan fungsi saya secara lokal menggunakan baris perintah:
firebase functions:shell

Saya menggunakan kode ini:

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

Saya mengubah garis
admin.initializeApp();
untuk
admin.initializeApp({ credential: admin.credential.applicationDefault() });
dan sekarang saya dapat memanggil fungsi saya secara lokal menggunakan:

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

Lihat dokumen untuk admin.credential.applicationDefault ()

Semua 61 komentar

@noelmansour terima kasih jadi sepertinya sesuatu antara 7.0.1 dan 7.0.2 menyebabkan ini, saya akan melihat perubahan yang dibuat.

Saya juga mengalami masalah ini sejak 7.0.2

Baru saja ditingkatkan ke 7.0.2, melihat ini juga. Memeriksa kredensial akun saya dan bidang client_email ada.

Bisakah seseorang membagikan kode fungsi yang mereka coba jalankan di emulator yang gagal dengan kesalahan ini? Semakin sederhana semakin baik.

@samtstern Kode berikut gagal untuk saya:

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

Ini hanya berfungsi jika saya menetapkan akun layanan saat memanggil admin.initializeApp() :

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

@wceolin terima kasih untuk itu! Dapatkah Anda menjalankan berikut ini di dalam direktori fungsi Anda?

$ npm list @google-cloud/firestore

Ini adalah hasil saya (dan semuanya bekerja untuk saya):

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

Saya mendapat hasil yang sama: 🤔

Screen Shot 2019-07-01 at 15 44 35

Jadi saya berjalan menuju jejak tumpukan kesalahan dan dalam fungsi ini:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141

Kami memiliki percabangan ini:

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

Dalam kode saya opts.sslCreds didefinisikan jadi saya menekan cabang ini:

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

Ini adalah cabang lain yang mencoba mengumpulkan kredensial dan menyebabkan masalah. Sekarang saya perlu mencari tahu mengapa kode saya berjalan satu arah dan kode Anda berjalan ke arah lain.

@wceolin dapatkah Anda membuka folder node_modules dan mengedit file ini functions/node_modules/google-gax/build/src/grpc.js untuk memiliki console.log() yang mencetak objek options di createStub function dan beri tahu saya apa yang Anda lihat?

Terima kasih atas bantuan Anda sejauh ini!

@samtstern Tidak yakin apakah ini membantu, tetapi saya melakukan banyak penyesuaian dengan package.json dan node_modules saya selama akhir pekan. Saya tidak lagi memiliki masalah di 7.0.2.

Output npm list @google-cloud/firestore cocok dengan milik Anda.

Saya nuked direktori node_modules saya selama akhir pekan jadi saya ingin tahu apakah itu terkait.

@noelmansour terima kasih atas catatan itu, menjelaskan mengapa saya tidak dapat mereproduksi dalam pengaturan yang bersih.

@noelmansour Saya juga mencoba menghapus node_modules , yarn.lock , menghapus ketergantungan tetapi tidak berhasil untuk saya. Saya akan mencoba membuat proyek dari awal untuk melihat apa yang terjadi.

@noelmansour inilah yang saya dapatkan dari objek 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 terima kasih itu sangat membantu karena seperti inilah penampilan saya (dan seperti apa seharusnya):

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

Seperti yang Anda lihat, klien Anda masih mencoba mengakses produksi, lalu gagal karena emulator fungsi tidak diizinkan untuk melakukannya.

Apakah Anda juga menjalankan emulator firestore? Apakah tujuan Anda untuk menulis ke emulator firestore atau Anda benar-benar ingin menulis ke firestore produksi?

OH SAYA AKHIRNYA MAMPU REPRODUKSI INI! Jika saya menjalankan firebase emulators:start --only functions maka saya mencoba menulis ke Firestore. Saya mendapatkan kesalahan ini.

Saya melihat pesan log ini:

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

Yang tidak lagi tepat (kesalahannya adalah tentang client_email) tetapi pendeteksiannya masih benar. Apakah orang lain di sini juga melihat peringatan ini?

Berikut beberapa info lebih lanjut yang mungkin bisa membantu. Selama akhir pekan, saya juga secara eksplisit menetapkan variabel env emulator firestore di .zshrc saya:

export FIRESTORE_EMULATOR_HOST="localhost:8080"

Saat saya menghapusnya, saya mendapatkan error. Dan ini dengan perintah firebase emulators:start

@noelmansour dapatkah Anda menjalankan perintah itu dengan --debug dan melampirkan log di sini sebagai file txt ?

@samtstern terkadang saya menggunakan emulator untuk melayani fungsi HTTP secara lokal yang menetapkan beberapa data dalam produksi (biasanya untuk melakukan migrasi data). Saya menggunakan:

firebase serve --only functions --project myProjectAlias

Saya tidak yakin apakah seharusnya berfungsi seperti itu (memungkinkan kami menulis data ke produksi) tetapi dulu berfungsi. 😅

@wceolin seharusnya tidak bekerja seperti itu dengan initializeApp() dalam versi setelah 6.8.0 . Saya juga memiliki kasus penggunaan itu tetapi kami ingin menemukan cara untuk membuat keikutsertaan itu sehingga defaultnya adalah melindungi produksi.

Tapi saya senang mengetahui dari mana kesalahan ini berasal sekarang!

@samtstern Hanya untuk mengonfirmasi, jalankan firebase emulators:start --debug dengan FIRESTORE_EMULATOR_HOST tidak disetel, benar?

Benar!

Pada hari Senin, 1 Juli 2019, 12:28 Noel Mansour [email protected] menulis:

@samtstern https://github.com/samtstern Hanya untuk mengonfirmasi, jalankan firebase
emulator: start --debug dengan FIRESTORE_EMULATOR_HOST tidak disetel, benar?

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODY7DO2Q#issuecomment-507393898 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.

Ini dia.

FYI saya menghapus project-id dari baris ini (tidak berpikir itu penting):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig

debug.txt

Juga perlu disebutkan, tanpa mengekspor variabel env, [email protected] memberi saya kesalahan ini:

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

Terima kasih @noelmansour untuk log tersebut. Maukah Anda menunjukkan kode fungsi Anda juga?

Agak rumit karena saya lebih suka tidak membagikan semua fungsi saya, dan saya tidak punya waktu sekarang untuk memverifikasi bahwa secara terpisah ini akan merepro kesalahan, tetapi inilah fungsi hello yang telah saya jalankan:

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 terima kasih! Itu baru saja mengungkapkan bug bagi saya. Kedua hal ini harus identik tetapi tidak:

Pilihan 1

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

pilihan 2

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

Yup, itu sudah diperbaiki untuk saya. Terima kasih!

Saya juga mengalami kesalahan Error: The incoming JSON object does not contain a client_email field . Tidak bisa memperbaikinya.

Kode default:

import { initializeApp } from 'firebase-admin';

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

Coba lagi:

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

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

Coba lagi:

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 perintah apa yang Anda gunakan untuk menjalankan emulator? Dapatkah Anda menampilkan perintah dan log dari menjalankannya dengan flag --debug ?

_Penafian: tidak yakin seberapa terkait masalah saya dengan masalah ini di sini, tetapi setidaknya saya dapat memberikan info saya di sini karena mungkin dapat membantu sebagian dari Anda._

Saya memiliki hal yang sama dalam fungsi firebase yang mencoba memperbarui beberapa dokumen dalam database firestore secara batch. (Tidak menguji tanpa batch).

Ini adalah callstack:

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

Saya menjalankan fungsi saya secara lokal menggunakan baris perintah:
firebase functions:shell

Saya menggunakan kode ini:

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

Saya mengubah garis
admin.initializeApp();
untuk
admin.initializeApp({ credential: admin.credential.applicationDefault() });
dan sekarang saya dapat memanggil fungsi saya secara lokal menggunakan:

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

Lihat dokumen untuk admin.credential.applicationDefault ()

@majelispesona

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

Mengenai log, tidak bisa hari ini, saya minta maaf untuk itu!

Saya mengubah garis
admin.initializeApp();
untuk
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Ini berhasil untuk saya. Saya menjalankan fungsi secara lokal melalui:
firebase serve --only functions

Tidak jelas bagi saya apakah ini aman untuk produksi. Dari dokumen, sepertinya itu akan memberi admin akses ke kode yang berjalan dalam produksi tetapi itu benar.

@ ralphsmith80 aah Anda mungkin benar:

Menemukan kredensial secara otomatis
Library klien GCP menggunakan strategi yang disebut Application Default Credentials (ADC) untuk menemukan kredensial aplikasi Anda. Saat kode Anda menggunakan pustaka klien, strategi akan memeriksa kredensial Anda dalam urutan berikut:

Pertama, ADC memeriksa untuk melihat apakah variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS disetel. Jika variabel disetel, ADC menggunakan file akun layanan yang ditunjuk variabel tersebut. Bagian selanjutnya menjelaskan cara menyetel variabel lingkungan.

Jika variabel lingkungan tidak disetel, ADC menggunakan akun layanan default yang disediakan oleh Compute Engine, Kubernetes Engine, App Engine, dan Cloud Functions, untuk aplikasi yang berjalan di layanan tersebut.

Jika ADC tidak dapat menggunakan salah satu dari kredensial di atas, kesalahan akan terjadi.

Strategi ini berguna saat menguji dan bereksperimen, tetapi dapat menyulitkan untuk mengetahui kredensial mana yang digunakan aplikasi Anda.

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

Saya mengubah garis
admin.initializeApp();
untuk
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Metode ini membuat kesalahan baru bagi saya.

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)

Saya juga menginisialisasi toko seperti yang Anda nyatakan di # 1454

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

Dengan kredensial tambahan ke initializeApp , saya mendapatkan kesalahan di atas.
Tanpanya, saya masih mendapatkan;

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)

Saya mendapatkan kesalahan yang sama ini pada tutorial dasar (tutorial dari Juni 2019) jadi kesalahan ini terlihat cukup baru ...

INDEX.JS:

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

});


Ketika saya menjalankan titik akhir di Postman saya mendapatkan pesan yang salah

"error": "ups, ada yang tidak beres"

Dengan konsol yang menyatakan:

Fungsi: Memulai eksekusi "createScream"
Kesalahan: Objek JSON yang masuk tidak berisi bidang client_email

Tutorial berasal dari FreeCodeCamp - https://www.youtube.com/watch?v=m_u6P5k0vP0

Firebase Console> Setelan (Ikon roda gigi)> Pengguna dan izin> Akun layanan

Hasilkan kunci baru.

Tambahkan json ke folder proyek Anda.

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

File json akun Layanan menyediakan layanan dan fitur firebase untuk proyek Anda.
Itu harus selalu pribadi. Sertakan file dalam .gitignore

Firebase Console> Setelan (Ikon roda gigi)> Pengguna dan izin> Akun layanan

Hasilkan kunci baru.

Tambahkan json ke folder proyek Anda.

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

File json akun Layanan menyediakan layanan dan fitur firebase untuk proyek Anda.
Itu harus selalu pribadi. Sertakan file dalam .gitignore


Terima kasih phtn, kami hargai - Saya mengikuti instruksi Anda tetapi sekarang saya mendapatkan kesalahan

Error: Error occurred while parsing your function triggers.

Anehnya, ketika saya menjalankan 'firebase deploy' semuanya berfungsi: ' https: //europe-west1-myapp.cloudfunctions.net/api / ... - BUKAN di localhost?

serviceAccountKey.json harus ada di direktori /functions .

firebase deploy --only functions akan mengeluh jika di luar.

Terima kasih sekali lagi (karena sudah sangat sabar!). ServiceAccountKey.json saya ada di folder / functions (Lihat screen-grab di link di bawah).

Tampaknya ada tiga cara untuk initilizeApp ... Saya telah mencoba ketiganya secara individual dan tidak satupun dari mereka tampaknya berhasil - Saya merasa ini akan menjadi sesuatu yang gila sederhana yang saya lewatkan.

D

Ambil Layar:
Screenshot 2019-07-10 at 09 22 32

Kami mengalami masalah yang sama di pihak kami. Kami menginisialisasi firebase dengan model ini:

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

Beri tahu saya jika kami dapat memberikan apa pun untuk membantu melacaknya.

Semua orang di utas ini. Kami menemukan solusi. Kami menurunkan versi firebase-tools dari 7.0.2 menjadi 7.0.1 dan menerima kesalahan yang sama sekali berbeda (sesuatu tentang tidak dapat memuat kredensial default).

Jadi kami melanjutkan dengan berlari:

gcloud auth application-default login

Ini memperbaiki masalah kami

@ryanhornberger Anda dapat mengatasi masalah Anda dengan melakukan:

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

Saya memiliki perbaikan untuk itu datang di # 1459

@samtstern terima kasih!

Semua orang di utas ini. Kami menemukan solusi. Kami menurunkan versi firebase-tools dari 7.0.2 menjadi 7.0.1 dan menerima kesalahan yang sama sekali berbeda (sesuatu tentang tidak dapat memuat kredensial default).

Jadi kami melanjutkan dengan berlari:

gcloud auth application-default login

Ini memperbaiki masalah kami

Ini berhasil untuk saya. Saya awalnya mengupgrade firebase-tools ke 7.1, saya mendapat 'kesalahan yang sama' saat menjalankan 'firebase serve' di lokal saya. Namun itu berfungsi dengan baik jika saya menerapkan ke firebase. Diturunkan ke 7.0.1 berfungsi untuk saya di lokal saya.

Masalah yang sama dengan 7.1

Kami sedang memperbaikinya, tetapi belum siap:
https://github.com/firebase/firebase-tools/pull/1479

Saya terjebak dengan ini, ada jalan keluar?

menurunkan versi ke 7.0.1 tidak membantu saya

Perbaikan untuk ini digabungkan menjadi # 1479 dan akan disertakan dalam rilis berikutnya (jadi 7.2.0 )

Hai @samtstern , tidak yakin apakah itu sesuatu yang saya lakukan secara tidak benar, atau mungkin beberapa masalah baru, tetapi saya telah memperhatikan beberapa hal yang menjalankan alat dari master terbaru (dad143c42445056014f6f48cc9dfa13156e3c186).

Pertama, saya mendapatkan peringatan berikut saat menjalankan firebase emulators:exec "npm run test" :

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

Meskipun sebelumnya dalam perintah, saya dapat melihat bahwa itu memulai emulator:

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

Ini sebenarnya tidak memperbarui DB firestore produksi. Mungkin hanya negatif palsu?

Masalah lainnya adalah saya masih mendapatkan kesalahan tersebut. Saya tidak menyetel $GOOGLE_APPLICATION_CREDENTIALS , tetapi menurut https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional seharusnya sudah ada izin yang memadai jika hanya mengakses firestore:

Pemicu Cloud Firestore dan Realtime Database sudah memiliki kredensial yang memadai, dan tidak memerlukan penyiapan tambahan.

Saya menginisialisasi sdk admin tanpa parameter apa pun menggunakan admin.initializeApp(); Mungkin sesuatu yang saya lakukan salah?

@noelmansour terima kasih telah melaporkan ini (dan untuk mencoba master !) Dapatkah Anda menunjukkan kode file fungsi utama Anda?

Hampir pasti negatif palsu, tetapi yang penting yang perlu kita perbaiki.

Ini sangat minimal karena hanya mengekspor dari file lain:

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

Sebenarnya, tampaknya ada masalah dengan pengaturan pengujian saya. Saat menjalankan firebase emulators:start Saya tidak melihat peringatan.

@noelmansour seperti apa tes Anda? Anda juga dapat mengajukan masalah baru untuk membahas hal ini sehingga kami tidak mengirim spam ke semua orang di utas ini>

Ya tentu saja. Permintaan maaf saya. # 1530 dibuka

Semua orang di utas ini. Kami menemukan solusi. Kami menurunkan versi firebase-tools dari 7.0.2 menjadi 7.0.1 dan menerima kesalahan yang sama sekali berbeda (sesuatu tentang tidak dapat memuat kredensial default).
Jadi kami melanjutkan dengan berlari:

gcloud auth application-default login

Ini memperbaiki masalah kami

Ini berhasil untuk saya. Saya awalnya mengupgrade firebase-tools ke 7.1, saya mendapat 'kesalahan yang sama' saat menjalankan 'firebase serve' di lokal saya. Namun itu berfungsi dengan baik jika saya menerapkan ke firebase. Diturunkan ke 7.0.1 berfungsi untuk saya di lokal saya.

Bisakah Anda memberi tahu cara menurunkan versi firebase? Versi saya saat ini adalah 7.0.2 kemudian saya mencoba menginstal npm i [email protected] -g this. tapi tetap saja versi saya adalah 7.0.2. bagaimana cara menurunkan versi tolong bantu?

Perbaikan lengkap untuk masalah ini telah dirilis dalam 7.2.0 :

npm install -g [email protected]

Jika Anda masih mengalami bug serupa pada versi itu, buka edisi baru.

Memiliki masalah yang sama dengan fungsi Firebase. Sudah mencoba npm install -g [email protected] yang menghasilkan error yang sama.

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

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

Memiliki masalah yang sama dengan fungsi Firebase. Sudah mencoba npm install -g [email protected] yang menghasilkan error yang sama.

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

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

Solusi berikut berhasil untuk saya:

// 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"
    })
});
Apakah halaman ini membantu?
0 / 5 - 0 peringkat