node.js - 为什么在 Cloud Functions 中查询时 Firestore 返回不一致的结果?

标签 node.js firebase google-cloud-firestore google-cloud-functions

我的目标是创建一个幂等云函数来更新某些文档的计数器。

我没有增加或减少计数器,而是查询文档并使用结果总数更新计数器。

const db = admin.firestore();

export const unprocessedReceiptsCount = 
functions.firestore.document('Purchases/{purchaseId}')
.onWrite(async (snapshot, context) => {

    const unprocessedRef = db.collection('Purchases').where('hasBeenProcessed', '==', false);
    const unprocessedSnap = await unprocessedRef.get();
    const count = unprocessedSnap.docs.length;
    console.log(count);
    return count;

});

当我更新任何文档中的 hasBeenProcessed 字段时,它应该记录一个一致的数字。但是,我得到的结果全是:2、63、8、44。每次函数运行时,它都会显示一个随机数。

我做错了什么?

最佳答案

最后,这是一个答案:

Google 员工是这样说的:

错误是由这个问题引起的https://github.com/grpc/grpc-node/issues/895 .我们的工程师建议删除 node_modules 并尝试重新安装,因为 grpc-js 0.4.1 现在未发布。

他们的解决方案对我不起作用,但这个确实有效:

npm uninstall @grpc/grpc-js
npm install @grpc/grpc-js@0.4.0

这也解决了 Cloud Functions 中的问题。

----原创评论---

我遇到了同样的问题。这在上周运行良好,现在即使是没有限制的简单 get() 也会返回随机数量的结果。

以下代码演示了管理 SDK 的问题。我已向 Google 提交错误报告。

var count = 10
getAgain()
function getAgain() {
  admin.firestore().collection('activity').get().then((qs) => {
    console.log("activities: got " + qs.docs.length)
    count--
    if (count) getAgain()
  })
}

CONSOLE LOG:
activities: got 24
activities: got 6
activities: got 6
activities: got 2
activities: got 11
activities: got 6
activities: got 2
activities: got 12
activities: got 13
activities: got 14

关于node.js - 为什么在 Cloud Functions 中查询时 Firestore 返回不一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56435210/

相关文章:

node.js - 使用 node.js 从 Firestore 中的子集合中删除文档

firebase - Cloud Firestore 离线加密

android - 如何在 firebase 中创建基于角色的访问控制或自定义声明

Node.js 动态聊天室

javascript - 如何使用 Node.js 和 Johnny-Five 解析 'cannot find module ' 串行端口?

ios - Firebase 重置密码问题

swift - Swift 3 中模块 'Firebase' 的重新定义

node.js - NodeJS集群和数据库连接

node.js - cassandra Node js 驱动程序的executeAsync 方法

ios - Firebase:第二次调用 setUserID() 似乎不起作用