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

时间:2019-04-28 06:50:20

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

在为Firebase Firestore编写基于事件的云功能时,通常会更新受影响文档中的字段,例如:

当更新 users collection 的文档时,将触发一个函数,假设我们要确定用户信息状态,并且拥有一个completeInfo: boolean属性,该函数将必须执行如果不使用类似needsUpdate: boolean之类的标志来确定是否执行该函数,则将发生无限循环。

还有其他方法可以解决此问题吗?还是这种情况是数据库设计方式的结果?我们如何避免最终遇到这种情况?

3 个答案:

答案 0 :(得分:2)

我对转换数据的云功能有几种常用方法:

  1. 将转换后的数据写到与触发Cloud Function的文档不同的文档中。到目前为止,这是一种更简单的方法,因为不需要其他代码-因此,我不会在其中犯任何错误。这也意味着没有额外的触发器,因此您无需为该额外的调用付费。

  2. 使用细化触发器来确保仅在需要实际执行某些工作时才调用我的Cloud Function。例如,我的许多功能仅在创建文档时才需要运行,因此通过使用onCreate触发器,我可以确保我的代码仅运行一次,即使最终更新新创建的文档也是如此。

  3. 将转换后的数据写入现有文档。在那种情况下,请确保在编写用于转换的实际代码之前检查是否需要进行转换。我宁愿不添加标志字段,而是使用现有数据进行检查。

    最近的一个例子是我更新文档中的金额,然后需要将其散发给所有用户:

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

答案 1 :(得分:0)

您需要注意避免编写无限触发自身的函数。这不是Cloud Functions可以为您做的事情。通常,您可以通过在函数中检查是否以前为上次调用中修改过的文档完成了工作来做到这一点。有几种方法可以做到这一点,您将必须实现一些满足您特定用例的东西。

答案 2 :(得分:0)

我将从执行时间角度采用这种方法,这意味着每个文档的功能将运行两次。每次触发文档时,lastUpdate字段都会带有时间戳,并且该函数仅在时间早于我的时间(例如10秒)时才更新文档。