【问题标题】:How to handle Firebase Cloud Functions infinite loops?如何处理 Firebase Cloud Functions 无限循环?
【发布时间】:2021-08-21 20:24:42
【问题描述】:

我有一个 Firebase Cloud 函数,它是由 Firebase 实时数据库中的某些数据的更新触发的。当数据更新时,我想读取数据,对该数据执行一些计算,然后将计算结果保存回实时数据库。它看起来像这样:

exports.onUpdate = functions.database.ref("/some/path").onUpdate((change) => {
    const values = change.after.val();
    const newValues = performCalculations(value);
    return change.after.ref.update(newValues);
});

我担心这可能会造成无限期的更新循环。我在Cloud Firestore Triggers 上看到了一条注释,上面写着:

“任何时候你写入触发函数的同一个文档, 您有创建无限循环的风险。谨慎使用并确保 在不需要更改时安全退出函数。”

所以我的第一个问题是:同样的问题是否适用于 Firebase 实时数据库?

如果是这样,防止无限循环的最佳方法是什么? 我应该比较快照之前/之后、键/值对等吗?

到目前为止我的想法:

exports.onUpdate = functions.database.ref("/some/path").onUpdate((change) => {

    // Get old values
    const beforeValues = change.before.val();

    // Get current values
    const afterValues = change.after.val();

    // Something like this???
    if (beforeValues === afterValues) return null;
    
    const newValues = performCalculations(afterValues);
    return change.after.ref.update(newValues);
});

谢谢

【问题讨论】:

    标签: node.js firebase-realtime-database google-cloud-functions


    【解决方案1】:

    同样的问题是否适用于 Firebase 实时数据库?

    是的,无论使用什么触发器类型,只要您写回触发 Cloud Function 运行的同一位置,就会发生无限循环。

    为了防止无限循环,您必须在代码中检测其条件。你可以:

    • 在处理节点/文档后通过向其中写入值来标记节点/文档,并在云函数开始时检查该标记。
    • 或者您可以检测 Cloud Function 代码是否对数据进行了有效的更改/改进,在没有更改/改进时不将其写回数据库。

    其中任何一个都可以工作,使用哪一个取决于您的用例。您的 if (beforeValues === afterValues) return null 是第二种方法的一种形式,并且确实可以工作 - 但这取决于您尚未共享的数据的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      相关资源
      最近更新 更多