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

Jon*_*ano 7 loops firebase google-cloud-functions google-cloud-firestore

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

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

还有其他方法来处理这种行为吗?或者这种情况是数据库设计方式的结果?我们怎样才能避免陷入这样的境地呢?

Fra*_*len 7

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

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

  2. 使用粒度触发器来确保我的云函数仅在需要实际执行某些工作时才被调用。例如,我的许多函数只需要在创建文档时运行,因此通过使用触发器,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
      }
    });
    
    Run Code Online (Sandbox Code Playgroud)