Firebase-tools: «Ошибка: входящий объект JSON не содержит поля client_email» после обновления до 7.0.2

Созданный на 28 июн. 2019  ·  61Комментарии  ·  Источник: firebase/firebase-tools

[ОБЯЗАТЕЛЬНО] Информация о среде


firebase-инструменты: 7.0.2


Платформа: Oracle Linux Server 7.6, Node 10.15

[ОБЯЗАТЕЛЬНО] Тестовый пример


эмулировать функцию https с помощью "firebase-admin": "^ 8.2.0", "firebase-functions": "^ 3.0.2"

[ОБЯЗАТЕЛЬНО] Шаги по воспроизведению

запустите любую функцию https с помощью функций firebase : shell

[ОБЯЗАТЕЛЬНО] Ожидаемое поведение

нет ошибки (firebase-tools 7.0.0 не выдает ошибок)

[ОБЯЗАТЕЛЬНО] Фактическое поведение

Отправлен запрос на работу.

firebase > ⚠  Error: The incoming JSON object does not contain a client_email field
    at JWT.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
    at GoogleAuth.fromJSON (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
    at GoogleAuth.getClient (/riderequest/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
    at GrpcClient._getCredentials (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:107:40)
    at GrpcClient.createStub (/riderequest/functions/node_modules/google-gax/build/src/grpc.js:223:34)
    at new FirestoreClient (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
    at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
    at ClientPool.acquire (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
    at ClientPool.run (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
    at Firestore.request (/riderequest/functions/node_modules/@google-cloud/firestore/build/src/index.js:957:33)
⚠  Your function was killed because it raised an unhandled error.
emulator-suite functions bug

Самый полезный комментарий

_Отказ от ответственности: не уверен, насколько моя проблема связана с этой здесь, но, по крайней мере, я могу оставить здесь свою информацию, так как это может помочь некоторым из вас.

У меня было то же самое в функции firebase, которая пытается обновить некоторый документ в базе данных firestore в пакетном режиме. (Без партии не тестировал).

Это стек вызовов:

Unhandled error Error: The incoming JSON object does not contain a client_email field
>      at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
>      at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
>      at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
>      at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
>      at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
>      at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
>      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
>      at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
>      at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
>      at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)

RESPONSE RECEIVED FROM FUNCTION: 500, {
  "error": {
    "status": "INTERNAL",
    "message": "INTERNAL"
  }
}

Я выполнял свою функцию локально, используя командную строку:
firebase functions:shell

Я использовал этот код:

// Reference report in Firestore
const db = admin.firestore();

admin.initializeApp();

export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
    return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
        if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));

        const batch = db.batch();
        snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));

        return batch.commit();
    });
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));

Я изменил строчку
admin.initializeApp();
к
admin.initializeApp({ credential: admin.credential.applicationDefault() });
и теперь я смог вызвать свою функцию локально, используя:

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

См. Документацию по admin.credential.applicationDefault ()

Все 61 Комментарий

@noelmansour, спасибо, похоже, это 7.0.1 и 7.0.2 , я посмотрю на внесенные изменения.

Я также испытываю эту проблему с 7.0.2

Только что обновился до 7.0.2, тоже это вижу. Проверил учетные данные моей учетной записи, и поле client_email присутствует.

Может ли кто-нибудь поделиться кодом функции, которую они пытаются запустить в эмуляторе, которая не работает с этой ошибкой? Чем проще, тем лучше.

@samtstern Следующий код мне не

import * as admin from 'firebase-admin';
admin.initializeApp();

import * as functions from 'firebase-functions';

export const testFunction = functions.https.onRequest(async (req, res) => {
  const request = await admin.firestore().doc('test/123').get();

  return request.ref.set({ test: 'random' })
    .then(() => res.send('ok!'))
    .catch((err) => res.status(500).send('error'));
});

Это работает, только если я установил учетную запись службы при вызове admin.initializeApp() :

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

@wceolin спасибо за это! Можете ли вы запустить в каталоге функций следующее?

$ npm list @google-cloud/firestore

Это мой результат (и у меня все работает):

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

Получил тот же результат: 🤔

Screen Shot 2019-07-01 at 15 44 35

Итак, я иду вверх по трассировке стека ошибок и в этой функции:
https://github.com/googleapis/gax-nodejs/blob/e1be4ebcc2287c61d5f1884033449e3b4e143242/src/grpc.ts#L141

У нас есть такое разветвление:

 async _getCredentials(opts: ClientStubOptions) {
    if (opts.sslCreds) {
      return opts.sslCreds;
    }
    const grpc = this.grpc;
    const sslCreds = grpc.credentials.createSsl();
    const client = await this.auth.getClient();
    const credentials = grpc.credentials.combineChannelCredentials(
      sslCreds,
      grpc.credentials.createFromGoogleCredential(client)
    );
    return credentials;
  }

В моем коде opts.sslCreds определено, поэтому я попал в эту ветку:

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

Это другая ветка, которая пытается собрать учетные данные и вызывает проблемы. Теперь мне нужно выяснить, почему мой код идет в одну сторону, а ваш - в другую.

@wceolin не могли бы вы node_modules и отредактировать этот файл functions/node_modules/google-gax/build/src/grpc.js чтобы получить console.log() который печатает объект options в createStub function и дайте мне знать, что вы видите?

Спасибо за вашу помощь!

@samtstern Не уверен, что это поможет, но за выходные я немного поработал с моими package.json и node_modules. У меня больше нет проблемы с 7.0.2.

Вывод npm list @google-cloud/firestore совпадает с вашим.

На выходных я уничтожил свой каталог node_modules, поэтому мне интересно, связано ли это с этим.

@noelmansour спасибо за эту заметку, объясняет, почему я не могу воспроизвести в чистой настройке.

@noelmansour Я также попытался удалить свои node_modules , yarn.lock , удалив зависимости, но у меня это не сработало. Я попробую создать проект с нуля, чтобы посмотреть, что получится.

@noelmansour это то, что я получил от объекта options :

{
  "clientConfig": {},
  "port":443,
  "servicePath":"firestore.googleapis.com",
  "credentials":{},
  "projectId":"my-test-project",
  "firebaseVersion":"8.2.0",
  "libName":"gccl",
  "libVersion":"2.2.3 fire/8.2.0",
  "scopes":[
    "https://www.googleapis.com/auth/cloud-platform", 
    "https://www.googleapis.com/auth/datastore"
  ]
}

@wceolin спасибо, это очень полезно, потому что так выглядит мой (и как он должен выглядеть):

{
   "clientConfig":{},
   "port":8080,
   "servicePath":"localhost",
   "credentials":{},
   "projectId":"fir-dumpster",
   "firebaseVersion":"8.2.0",
   "libName":"gccl",
   "libVersion":"2.2.3 fire/8.2.0",
   "service":"firestore.googleapis.com",
   "sslCreds":{
      "callCredentials": {}
   },
   "customHeaders":{
      "Authorization":"Bearer owner"
   },
   "scopes":[
      "https://www.googleapis.com/auth/cloud-platform",
      "https://www.googleapis.com/auth/datastore"
   ]
}

Как видите, ваш клиент все еще пытается получить доступ к производственной среде, а затем он терпит неудачу, потому что эмулятор функций не авторизован для этого.

Вы также используете эмулятор firestore? Ваша цель - писать в эмулятор firestore или вы действительно хотите писать в производственный firestore?

Ой, я наконец смог воспроизвести это! Если я запускаю firebase emulators:start --only functions я пытаюсь написать в Firestore, я получаю эту ошибку.

Я вижу это сообщение журнала:

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

Что уже не совсем правильно (ошибка связана с client_email), но обнаружение все еще верно. Другие здесь тоже видят это предупреждение?

Вот еще информация, которая может помочь. На выходных я также явно установил переменную env эмулятора firestore в моем .zshrc:

export FIRESTORE_EMULATOR_HOST="localhost:8080"

При удалении выдает ошибку. И это с помощью команды firebase emulators:start

@noelmansour, можете ли вы запустить эту команду с помощью --debug и прикрепить сюда журналы в виде файла txt ?

@samtstern иногда я использовал эмулятор для локального обслуживания HTTP-функции, которая устанавливает некоторые данные в производство (обычно для некоторой миграции данных). Я использую:

firebase serve --only functions --project myProjectAlias

Я не уверен, что это должно было работать так (позволяя нам записывать данные в производство), но раньше это работало. 😅

@wceolin не должен был так работать с пустыми initializeApp() в версиях после 6.8.0 . У меня тоже есть такой вариант использования, но мы хотим найти способ сделать это, чтобы по умолчанию было защищено производство.

Но я рад узнать, откуда взялась эта ошибка!

@samtstern Для подтверждения запустите firebase emulators:start --debug задав FIRESTORE_EMULATOR_HOST , правильно?

Верный!

В пн, 1 июля 2019 г., 12:28 Ноэль Мансур [email protected] написал:

@samtstern https://github.com/samtstern Просто для подтверждения запустите firebase
эмуляторы: start --debug с не установленным FIRESTORE_EMULATOR_HOST, правильно?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/firebase/firebase-tools/issues/1451?email_source=notifications&email_token=ACATB2WV27VPIODNLGFS4TLP5JLGBA5CNFSM4H4GTWI2YY3PNVWWK3TREX5BODW2VMWWK3TREXW2WWGWWWK3TREXWWGW2VWWWK3TREXWWGWW2VWWK3TREXWWGW2
или отключить поток
https://github.com/notifications/unsubscribe-auth/ACATB2WG4EAD5KU7YRB5AUTP5JLGBANCNFSM4H4GTWIQ
.

Вот.

К вашему сведению, я удалил идентификатор проекта из этой строки (не думаю, что это имеет значение):
[2019-07-01T19:32:42.859Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/<project-id>:getServerAppConfig

debug.txt

Также стоит упомянуть, что без экспорта переменной env [email protected] выдает мне эту ошибку:

⚠  Error: Getting metadata from plugin failed with error: Header field "authorization" must have only a single value
    at Http2CallStream.call.on (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call.js:68:41)
    at emitOne (events.js:121:20)
    at Http2CallStream.emit (events.js:211:7)
    at process.nextTick (/Users/noel/dev/snowble/functions/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
    at _combinedTickCallback (internal/process/next_tick.js:132:7)
    at process._tickCallback (internal/process/next_tick.js:181:9)
⚠  Your function was killed because it raised an unhandled error.

Спасибо @noelmansour за эти журналы. Не могли бы вы также показать код ваших функций?

Это немного сложно, потому что я бы предпочел не делиться всеми своими функциями, и у меня сейчас нет времени проверить, что изолированно это воспроизведет ошибку, но вот функция приветствия, которую я выполнял:

index.ts:

require('./common'); // this should always be first in this file

export * from './debug'
// other exports for other functions

common.ts:

import * as admin from 'firebase-admin';

export const app = admin.initializeApp();

debug.ts:

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
import {app} from "./common";

export const hello = functions.https.onRequest(async (req, resp) => {
    const firestore = app.firestore();
    const users = await firestore.collection('users').get();
    console.log('empty users collection? ' + users.empty);
    resp.sendStatus(200);
});

package.json:

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "emulators": "npm run build && firebase emulators:start",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "main": "lib/index.js",
  "dependencies": {
    "@google-cloud/tasks": "^1.1.0",
    "@types/jsonwebtoken": "^8.3.2",
    "@types/request-promise": "^4.1.42",
    "firebase-admin": "^8.2.0",
    "firebase-functions": "^3.0.2",
    "request": "^2.88.0",
    "request-promise": "^4.2.4"
  },
  "devDependencies": {
    "tslint": "^5.12.0",
    "typescript": "^3.2.2"
  },
  "private": true
}

@noelmansour спасибо! Это только что показало мне ошибку. Эти две вещи должны быть идентичными, но это не так:

Опция 1

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

Вариант 2

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

Ага, это исправило для меня. Благодаря!

У меня также ошибка Error: The incoming JSON object does not contain a client_email field . Не могу это исправить.

Код по умолчанию:

import { initializeApp } from 'firebase-admin';

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

Еще одна попытка:

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

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

Еще одна попытка:

import * as admin from 'firebase-admin';

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

@JFGHT какую команду вы используете для запуска эмуляторов? Можете ли вы показать команду и журналы ее выполнения с флагом --debug ?

_Отказ от ответственности: не уверен, насколько моя проблема связана с этой здесь, но, по крайней мере, я могу оставить здесь свою информацию, так как это может помочь некоторым из вас.

У меня было то же самое в функции firebase, которая пытается обновить некоторый документ в базе данных firestore в пакетном режиме. (Без партии не тестировал).

Это стек вызовов:

Unhandled error Error: The incoming JSON object does not contain a client_email field
>      at JWT.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\jwtclient.js:165:19)
>      at GoogleAuth.fromJSON (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:294:16)
>      at GoogleAuth.getClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-auth-library\build\src\auth\googleauth.js:476:52)
>      at GrpcClient._getCredentials (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:107:40)
>      at GrpcClient.createStub (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\google-gax\build\src\grpc.js:223:34)
>      at new FirestoreClient (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\v1\firestore_client.js:128:39)
>      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:315:26)
>      at ClientPool.acquire (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:61:35)
>      at ClientPool.run (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\pool.js:114:29)
>      at Firestore.readStream (D:\thdk\Projects\timesheets\functions\node_modules\firebase-admin\node_modules\@google-cloud\firestore\build\src\index.js:995:26)

RESPONSE RECEIVED FROM FUNCTION: 500, {
  "error": {
    "status": "INTERNAL",
    "message": "INTERNAL"
  }
}

Я выполнял свою функцию локально, используя командную строку:
firebase functions:shell

Я использовал этот код:

// Reference report in Firestore
const db = admin.firestore();

admin.initializeApp();

export const performMyCallableFirebaseFunction = (db,, { from, to }) => {
    return db.collection("collectionName").where("prop", "==", from).limit(500).get().then(snapshot => {
        if (snapshot.empty) return new Promise(resolve => resolve(`No docs found with prop: ${from}`));

        const batch = db.batch();
        snapshot.forEach(doc => batch.update(doc.ref, { prop: to }));

        return batch.commit();
    });
};
exports.myCallableFirebaseFunction = functions.https.onCall(data => performMyCallableFirebaseFunction(db, data.from, data.to));

Я изменил строчку
admin.initializeApp();
к
admin.initializeApp({ credential: admin.credential.applicationDefault() });
и теперь я смог вызвать свою функцию локально, используя:

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

См. Документацию по admin.credential.applicationDefault ()

@samtstern

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

Что касается логов, не может быть сегодня, прошу прощения за это!

Я изменил строчку
admin.initializeApp();
к
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Это сработало для меня. Я запускаю функции локально через:
firebase serve --only functions

Мне не ясно, безопасно ли это для производства. Из документации похоже, что это даст администратору доступ к коду, запущенному в производстве, но в любом случае это правда.

@ ralphsmith80 ааа, наверное, ты прав:

Автоматический поиск учетных данных
Клиентские библиотеки GCP используют стратегию под названием Application Default Credentials (ADC) для поиска учетных данных вашего приложения. Когда ваш код использует клиентскую библиотеку, стратегия проверяет ваши учетные данные в следующем порядке:

Сначала ADC проверяет, установлена ​​ли переменная среды GOOGLE_APPLICATION_CREDENTIALS. Если переменная установлена, ADC использует файл учетной записи службы, на который указывает переменная. В следующем разделе описывается, как установить переменную среды.

Если переменная среды не задана, ADC использует учетную запись службы по умолчанию, которую предоставляют Compute Engine, Kubernetes Engine, App Engine и Cloud Functions, для приложений, работающих в этих службах.

Если ADC не может использовать ни одну из вышеуказанных учетных данных, возникает ошибка.

Эта стратегия полезна при тестировании и экспериментировании, но может затруднить определение учетных данных, которые использует ваше приложение.

Источник: https://cloud.google.com/docs/authentication/production

Я изменил строчку
admin.initializeApp();
к
admin.initializeApp({ credential: admin.credential.applicationDefault() });

Этот метод создает для меня совершенно новую ошибку.

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
      at GoogleAuth.getApplicationDefaultAsync (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
     at process._tickCallback (internal/process/next_tick.js:68:7)

Я также инициализирую магазин, как вы указали в # 1454

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

С добавленными учетными данными к initializeApp я получаю указанную выше ошибку.
Без этого я все равно получаю;

Error: The incoming JSON object does not contain a client_email field
      at JWT.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/jwtclient.js:165:19)
      at GoogleAuth.fromJSON (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:294:16)
      at GoogleAuth.getClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:476:52)
      at GrpcClient._getCredentials (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:107:40)
      at GrpcClient.createStub (/Users/otanriverdi/Projects/socialpong/functions/node_modules/google-gax/build/src/grpc.js:223:34)
      at new FirestoreClient (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/v1/firestore_client.js:128:39)
      at ClientPool.Firestore._clientPool.pool_1.ClientPool [as clientFactory] (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:315:26)
      at ClientPool.acquire (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:61:35)
      at ClientPool.run (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/pool.js:114:29)
      at Firestore.readStream (/Users/otanriverdi/Projects/socialpong/functions/node_modules/@google-cloud/firestore/build/src/index.js:995:26)

Я получаю ту же ошибку в базовом руководстве (учебное пособие от июня 2019 г.), поэтому эта ошибка выглядит довольно новой ...

INDEX.JS:

`` `const 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);
    });

});


Когда я запускаю конечную точку в Postman, я получаю сообщение об ошибке

"error": "oops, что-то пошло не так"

С сообщением консоли:

Функции: Начало выполнения createScream
Ошибка: входящий объект JSON не содержит поля client_email.

Учебник взят с сайта FreeCodeCamp - https://www.youtube.com/watch?v=m_u6P5k0vP0

Консоль Firebase> Настройки (значок шестеренки)> Пользователи и разрешения> Учетные записи служб

Сгенерируйте новый ключ.

Добавьте json в папку вашего проекта.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://lts-profile.firebaseio.com"
});

Json-файл учетной записи службы делает ваши службы и функции firebase доступными для вашего проекта.
Это всегда должно быть приватным. Включить файл в .gitignore

Консоль Firebase> Настройки (значок шестеренки)> Пользователи и разрешения> Учетные записи служб

Сгенерируйте новый ключ.

Добавьте json в папку вашего проекта.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://lts-profile.firebaseio.com"
});

Json-файл учетной записи службы делает ваши службы и функции firebase доступными для вашего проекта.
Это всегда должно быть приватным. Включить файл в .gitignore


Спасибо, phtn, оценил - я выполнил ваши инструкции, но теперь получаю сообщение об ошибке

Error: Error occurred while parsing your function triggers.

Как ни странно, когда я запускаю firebase deploy, все работает: https: //europe-west1-myapp.cloudfunctions.net/api / ... - только НЕ на локальном

serviceAccountKey.json должен находиться в каталоге /functions .

firebase deploy --only functions пожалуется, если будет снаружи.

Еще раз спасибо (за такое терпение!). Мой serviceAccountKey.json находится в папке / functions (см. Снимок экрана по ссылке ниже).

Похоже, есть три способа инициализировать приложение ... Я попробовал все три из них по отдельности, и ни один из них, похоже, не работает - у меня такое чувство, что это будет что-то безумно простое, чего мне не хватает.

D

Снимок экрана:
Screenshot 2019-07-10 at 09 22 32

На нашей стороне та же проблема. Мы инициализируем firebase по этой модели:

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

Дайте мне знать, если мы можем предоставить что-нибудь, чтобы помочь отследить это.

Все в этой ветке. Мы нашли решение. Мы понизили версию firebase-tools с 7.0.2 до 7.0.1 и получили совершенно другую ошибку (что-то о невозможности загрузить учетные данные по умолчанию).

Итак, мы продолжили, запустив:

gcloud auth application-default login

Это устранило нашу проблему

@ryanhornberger, вы можете обойти свою проблему, выполнив:

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

У меня есть исправление в # 1459

@samtstern, спасибо!

Все в этой ветке. Мы нашли решение. Мы понизили версию firebase-tools с 7.0.2 до 7.0.1 и получили совершенно другую ошибку (что-то о невозможности загрузить учетные данные по умолчанию).

Итак, мы продолжили, запустив:

gcloud auth application-default login

Это устранило нашу проблему

У меня это работает. Изначально я обновил firebase-tools до 7.1, я получил «ту же ошибку», когда запустил «firebase serve» на своем локальном компьютере. Однако он работает нормально, если я развернул его на firebase. Понижение до 7.0.1 у меня работает в моем локальном.

Та же проблема с 7.1

Мы работаем над исправлением, но оно еще не готово:
https://github.com/firebase/firebase-tools/pull/1479

Я застрял с этим, пожалуйста, выход?

переход на 7.0.1 мне не помог

Исправление для этого было объединено в # 1479 и будет включено в следующий выпуск (так что 7.2.0 )

Привет, @samtstern , не уверен, что я делаю что-то неправильно, или, возможно, пара новых проблем, но я заметил несколько вещей, которые запускают инструменты с последней версии мастера (dad143c42445056014f6f48cc9dfa13156e3c186).

Сначала я получаю следующее предупреждение при запуске firebase emulators:exec "npm run test" :

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

Хотя ранее в команде я вижу, что он запускает эмулятор:

~/d/s/functions ❯❯❯ firebase emulators:exec "npm run test"                                                                                                                           ✘ 130
i  Starting emulators: ["functions","firestore"]
✔  functions: Using node<strong i="12">@8</strong> from host.
✔  functions: Emulator started at http://localhost:5001
i  firestore: Logging to firestore-debug.log
✔  firestore: Emulator started at http://localhost:8080
i  firestore: For testing set FIRESTORE_EMULATOR_HOST=localhost:8080

На самом деле это не обновление производственной базы данных firestore. Может просто ложноотрицательный?

Другая проблема в том, что я все еще получаю сообщение об ошибке. Я не установил $GOOGLE_APPLICATION_CREDENTIALS , но, согласно https://firebase.google.com/docs/functions/local-emulator#set_up_admin_credentials_optional, уже должно быть достаточное разрешение, если только доступ к хранилищу огня:

Триггеры Cloud Firestore и Realtime Database уже имеют достаточные учетные данные и не требуют дополнительной настройки.

Я инициализирую admin sdk без каких-либо параметров с помощью admin.initializeApp(); Возможно, я что-то делаю неправильно?

@noelmansour, спасибо за сообщение об этом (и за попытку master !). Вы можете показать код вашего основного файла функций?

Почти наверняка ложноотрицательный, но важный, который нам нужно исправить.

Это довольно минимально, поскольку он просто экспортирует из других файлов:

import * as admin from 'firebase-admin';

// this should happen before any function runs
admin.initializeApp();

export * from './authFunctions';
export * from './fitbit';
export * from './sleep'
export * from './scheduler';
export * from './debug'
export {scheduleFunction} from "./scheduler";

На самом деле, похоже, это проблема с моей тестовой настройкой. При запуске firebase emulators:start я не вижу предупреждения.

@noelmansour как выглядят ваши тесты? Также не могли бы вы написать новую проблему, чтобы обсудить это, чтобы мы не спамили всем в этой теме>

Да, конечно. Мои извенения. # 1530 открыт

Все в этой ветке. Мы нашли решение. Мы понизили версию firebase-tools с 7.0.2 до 7.0.1 и получили совершенно другую ошибку (что-то о невозможности загрузить учетные данные по умолчанию).
Итак, мы продолжили, запустив:

gcloud auth application-default login

Это устранило нашу проблему

У меня это работает. Изначально я обновил firebase-tools до 7.1, я получил «ту же ошибку», когда запустил «firebase serve» на своем локальном компьютере. Однако он работает нормально, если я развернул его на firebase. Понижение до 7.0.1 у меня работает в моем локальном.

Не могли бы вы рассказать, как понизить версию firebase? Моя текущая версия - 7.0.2, тогда я попытался установить npm i [email protected] -g this. но все же моя версия 7.0.2. как перейти на более раннюю, пожалуйста, помогите?

Полное исправление этой проблемы выпущено в 7.2.0 :

npm install -g [email protected]

Если вы все еще сталкиваетесь с аналогичной ошибкой в ​​этой версии, откройте новую проблему.

Такая же проблема с функциями Firebase. Уже пробовал npm install -g [email protected], что привело к той же ошибке.

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

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

Такая же проблема с функциями Firebase. Уже пробовал npm install -g [email protected], что привело к той же ошибке.

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

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

У меня сработало следующее решение:

// Create Firebase-adminsdk key

// Providing a service account object inline
admin.initializeApp({
    credential: admin.credential.cert({
        projectId: "<PROJECT_ID>",
        clientEmail: "foo@<PROJECT_ID>.iam.gserviceaccount.com",
        privateKey: "-----BEGIN PRIVATE KEY-----<KEY>-----END PRIVATE KEY-----\n"
    })
});
Была ли эта страница полезной?
0 / 5 - 0 рейтинги