Ошибка эмулятора Firebase: учетные данные канала должны быть объектом ChannelCredentials - PullRequest
3 голосов
/ 05 мая 2020

Я использую эмуляторы Firebase. До 4 часов go все работало нормально. Но теперь мои эмулированные облачные функции вызывают следующую ошибку:

>  Error with Backup TypeError: Channel credentials must be a ChannelCredentials object
>      at new ChannelImplementation (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/node_modules/@grpc/grpc-js/build/src/channel.js:67:13)
>      at new Client (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/node_modules/@grpc/grpc-js/build/src/client.js:57:36)
>      at new ServiceClientImpl (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/node_modules/@grpc/grpc-js/build/src/make-client.js:49:5)
>      at GrpcClient.createStub (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/build/src/grpc.js:220:22)

Я четко определил проблему: она появляется каждый раз, когда я делаю запрос Firestore.

Например, это вычитание всей функции:

  return new Promise((resolve, reject) => {
    db.doc(`users/${userId}`).update({ dbUpdated: new Date() })
      .then(() => {
        resolve();
      })
      .catch(e => reject(e));
  });

Если я заменю его на:

  return Promise.resolve();

У меня больше нет ошибки. Но, очевидно, у меня больше нет ожидаемого поведения ...

Я сделал большой рефакторинг (я установил eslint в стиле airbnb, поэтому мне пришлось изменить довольно много файлов), поэтому я, вероятно, сделал что-то не так . Но после нескольких часов исследования я не нашел, что могло бы оправдать эту ошибку: (

Я даю вам ниже соответствующий фрагмент моего кода. Мой реальный код намного длиннее, но я тестировал только этот фрагмент : он воспроизводит ошибку (и если я заменю функцию «markUserUpdated», как показано ранее, она исчезнет.)

И последнее, но не менее важное: я подтверждаю, что эмулятор Firestore работает нормально: приложение работает хорошо с данными из эмулятора.

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

index.js:

const functions = require('firebase-functions');
const { db } = require('./admin');

const DEBUG = true;

function markUserUpdated(userId) {
  return new Promise((resolve, reject) => {
    db.doc(`users/${userId}`).update({ dbUpdated: new Date() })
      .then(() => {
        if (DEBUG) console.log('User successfully marked Updated', userId);
        resolve();
      })
      .catch(e => reject(e));
  });
}

exports.writeContact = functions.firestore
  .document('users/{userId}/contacts/{contactId}')
  .onWrite((doc, context) => {
    const { userId } = context.params;
    return markUserUpdated(userId);
  });

admin.js:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

const serviceAccount = require('../serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://my-app.firebaseio.com',
  storageBucket: 'my-app.appspot.com',
});

const db = admin.firestore();
const { FieldValue } = admin.firestore;
const { Timestamp } = admin.firestore;

const storage = admin.storage();

module.exports = {
  db, storage, FieldValue, Timestamp, functions,
};

Редактировать : код обрабатывается Babel (не знаю, может ли это повлиять)

Ответы [ 3 ]

8 голосов
/ 11 мая 2020

Проблема связана с конкретной c версией пакета google-gax.

Мне удалось решить проблему, выполнив следующий шаг.

$ npm i -D google-gax

2 голосов
/ 05 мая 2020

Удаление папки functions / node_modules и их переустановка решило проблему.

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

0 голосов
/ 04 июля 2020

Мне пришлось:

  1. удалить node_modules
  2. обновить зависимости
  3. переустановить

следующим образом

cd functions
rm -rf node_modules
npm install -g npm-check-updates
ncu -u
npm install
...