【问题标题】:Firebase Emulator Error: Channel credentials must be a ChannelCredentials objectFirebase 模拟器错误:通道凭据必须是 ChannelCredentials 对象
【发布时间】:2020-08-19 15:27:52
【问题描述】:

我正在使用 Firebase 模拟器。直到 4 小时前,一切正常。但是现在,我模拟的云函数触发了以下错误:

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

我没有错误了。但显然我不再有预期的行为了......

我做了一个大的重构(我安装了airbnb风格的eslint,所以我不得不修改很多文件),所以我可能做错了什么。但是经过几个小时的研究,我还没有找到可以证明这个错误的理由:(

我在下面为您提供了我的代码的相关摘录。我的真实代码要长得多,但我单独测试了这个提取:它重现了错误(如果我替换前面显示的“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进行(不知道会不会有影响)

【问题讨论】:

  • 如果您认为这是模拟器的错误,请在 GitHub 上提交问题。 github.com/firebase/firebase-tools
  • 这可能是一个错误,但我更有可能是问题的原因 :( 我恢复了我今天所做的所有 firebase 依赖项更新,问题仍然存在。你知道是怎么回事吗?创建了“频道凭据”?
  • 嗨@Pitouli,此文档here 说明了您需要如何连接模拟器以及如何需要和配置ChannelCredentials。你能看看它,看看它是否对你有帮助?
  • 谢谢@gso_gabriel!重新安装所有的 node_modules 就可以了,但是如果发生类似的问题肯定会有所帮助!
  • 删除 node_modules 对我不起作用。有人有同样的问题吗?

标签: javascript firebase google-cloud-firestore google-cloud-functions firebase-tools


【解决方案1】:

我不得不:

  1. 删除节点模块
  2. 更新依赖项
  3. 重新安装

如下

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

【讨论】:

    【解决方案2】:

    问题是由于 google-gax 包的特定版本造成的。

    我能够通过以下步骤解决问题。

    $ npm i -D google-gax

    【讨论】:

      【解决方案3】:

      删除 functions/node_modules 文件夹并重新安装它们已经解决了这个问题。

      如果我重现导致应用崩溃的操作,我会回来编辑这篇文章。

      【讨论】: