firebase - 编写云函数时如何避免循环?

标签 firebase loops google-cloud-firestore google-cloud-functions

为 firebase firestore 编写基于事件的云函数时,通常会更新受影响文档中的字段,例如:

当更新用户集合的文档时,将触发一个函数,假设我们要确定用户信息状态,并且我们有一个 completeInfo: boolean属性,如果我们不使用像 needsUpdate: boolean 这样的标志,函数将不得不执行另一个更新,以便触发器再次触发。为了确定是否执行该函数,我们将有一个无限循环。

有没有其他方法可以解决这种行为?或者这种情况是数据库设计方式的结果?我们怎么能避免在这种情况下结束?

最佳答案

我有一些转换数据的 Cloud Functions 常用方法:

  • 将转换后的数据写入与触发 Cloud Function 的文档不同的文档。这是迄今为止更简单的方法,因为不需要额外的代码 - 因此我不会犯任何错误。这也意味着没有额外的触发器,因此您无需为额外的调用付费。
  • 使用粒度触发器确保我的 Cloud Function 仅在需要实际执行某些工作时才被调用。例如,我的许多函数只需要在创建文档时运行,因此使用 onCreate我确保我的代码只运行一次,即使它最终更新了新创建的文档。
  • 将转换后的数据写入现有文档。在这种情况下,我确保在编写转换的实际代码之前检查是否需要转换。我更喜欢不添加标志字段,而是使用现有数据进行此检查。

    最近的一个例子是我更新文档中的金额,然后需要将其分发给所有用户:
    exports.fanoutAmount = functions.firestore.document('users/{uid}').onWrite((change, context) => {
      let old_amount = change.before && change.before.data() && change.before.data().amount ? change.before.data().amount : 0;
      let new_amount = change.after.data().amount;
      if (old_amount !== new_amount) {
        // TODO: fan out to all documents in the collection
      }
    });
    
  • 关于firebase - 编写云函数时如何避免循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55887753/

    相关文章:

    reactjs - 带 React 路由器的 Firebase 托管

    firebase - 如何在 Firebase 主机上禁用弱 SSL 密码

    node.js - 阵列更新后 Firestore 不显示更新的文档

    javascript - 在云函数中获取文档值

    reactjs - 我的 React 组件正在重新渲染,无法弄清楚为什么

    firebase - 更新 Firestore 中数组的 Map 数据 - Flutter

    python - 在字符串切片中包含完整的单词

    python - C 和 Python 之间的 break 语句有区别吗?

    c# - 递归循环 (C#)

    java - 如何使用 spring data 从 firestore 的子集合中获取文档