尝试将谷歌云功能与 node.js 一起使用时,admin.firestore 不是一个功能

Posted

技术标签:

【中文标题】尝试将谷歌云功能与 node.js 一起使用时,admin.firestore 不是一个功能【英文标题】:admin.firestore is not a function when trying to use google cloud functions with node.js 【发布时间】:2018-03-22 14:41:55 【问题描述】:

这是 node.js index.js 文件的标题:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();

这是监听 firestore 变化的 node.js 函数:

exports.myFoo = functions.firestore
  .document('foo/bar')
  .onWrite(event => 
    // do stuff

这是在 package.json 文件中:

  "dependencies": 
    "firebase-admin": "^5-.4.2",
    "firebase-functions": "^0.7.1",
    "firestore": "^1.1.6"
  ,

当我尝试执行“firebase deploy”命令时,这是我得到的错误:

错误:解析函数触发器时出错。 TypeError: admin.firestore 不是函数

询问Firebase

【问题讨论】:

可能你没有最新版本的SDK。通过在项目的函数目录中运行npm install firebase-functions@latest --save,按照the documentation 中的说明获取它。 我认为您在依赖项中不需要firestore?我有一个工作的 firestore/firebase-functions sn-p,只有两个依赖项 "firebase-admin": "^5.4.1""firebase-functions": "^0.7.0" @BobSnyder 我同时运行了npm install firebase-functions@latest --savenpm install -g firebase-tools,然后再次尝试了firebase deploy,但仍然出现相同的错误消息。我有 firebase 3.13.1 版和 npm 3.10.10 版。 @DauleDK 我从依赖项中删除了 firestore,但部署仍然抛出相同的错误消息。 @AjahnCharles 回顾我对这篇文章的编辑,当问题第一次出现时,我最初拥有"firebase-admin": "^5.4.2",。在寻找解决方案的过程中的某个时刻,我注意到版本号中添加的连字符发生了变化,并更新了帖子。这意味着即使它可能是一个问题,它也不是这个错误的“问题”。不过感谢您的帮助。 【参考方案1】:

我能够重现错误并暴力破解解决方案。我对npm 了解不多,也无法完整解释为什么这个解决方案有效。

我原来的package.json 包含:

  "dependencies": 
    ...
    "firebase-admin": "^4.2.1",
    "firebase-functions": "^0.7.1",
    ...
  ,

作为recommended in the documentation,我在functions文件夹中运行了这两个命令:

npm install -g firebase-tools
npm install firebase-functions@latest --save

我也试过了:

npm install --save firebase-admin
npm upgrade

我反复收到这些错误消息:

+-- UNMET PEER DEPENDENCY firebase-admin@4.2.1
npm WARN firebase-functions@0.7.1 requires a peer of firebase-admin@~5.4.2 but none was installed.

我认为firebase-admin 需要更新,但无法实现。所以我编辑了依赖文件删除了这一行:

"firebase-admin": "^4.2.1"

然后再次运行npm install --save firebase-admin。这样,package.json 包含版本 "firebase-admin": "^5.4.2"var db = admin.firestore(); 编译没有错误。

【讨论】:

看来您的回答又帮助了here on this question。谢谢。也许未来的我会记住这一点。 :-)【参考方案2】:

functions.firestore 应该是functions.firestore()

【讨论】:

【参考方案3】:

试试这个

const getReceiverDataPromise = admin.firestore().doc('users/' + receiverUID).get();
const getSenderDataPromise = admin.firestore().doc('users/' + senderUID).get();

return Promise.all([getReceiverDataPromise, getSenderDataPromise]).then(results => 

        const receiver = results[0].data();
        console.log("receiver: ", receiver);

        const sender = results[1].data();
        console.log("sender: ", sender);

    );

【讨论】:

【参考方案4】:

在你的 file.js 中解决(异步方法):

const getFirestore = () => admin.firestore()

示例:

 getFirestore()
  .collection(`mailchimp-users`)
  .doc(uid)
    .set(profile)
      .then(() => res.redirect(MAILCHIMP_AUTH_SUCCESS_URL))
      .catch((error) => res.json(error))

【讨论】:

以上是关于尝试将谷歌云功能与 node.js 一起使用时,admin.firestore 不是一个功能的主要内容,如果未能解决你的问题,请参考以下文章

将谷歌云功能连接到云 sql (postgreSQL)

将谷歌云存储文件夹挂载到谷歌人工智能平台作业

谷歌云 pubsub node.js 客户端与谷歌云功能不兼容

发送身份验证承载令牌时出现 Cors 策略错误 - node.js(谷歌云功能)

如何将谷歌云构建步骤文本输出保存到文件

401 Unauthorized 尝试调用谷歌云功能时