如何防止火基云功能"conflicting"?



我有一组具有基于时间的派生属性的对象。

我有一个firebase云功能,正在聆听创建和写作以计算属性,并且运行良好。

我还添加了一个通过HTTP(例如Cron)触发的函数,以在周日清晨重新计算该物业(该属性将每周更改)。

这很好,但是每当CRON函数更新属性时,第一个功能就会捕获写入并重新完成整个计算。

有没有简单的方法来防止这种情况?我已经探索了设置一个环境变量,以检测到CRON是否运行的第一个函数,但是似乎无法在运行时设置环境变量。

您应该能够通过检查上一个值来防止这种情况。我将尝试提供一个示例

exports.yourFunction = functions.database.ref('/somepath/{someKey}').onWrite(event => {
  if (event.data.previous.val().time != event.data.val().time) {
    return;
  }
  else {
    // perform calculation
  }
 });

总结如果以前的值与当前值不同,则变量time只是通过您的其他函数更改。您需要将.time更改为变量名称。

注意:这并不能阻止函数触发,而仅防止其再次预定计算。如果您根本不希望该功能触发,则必须设计一种计算值的不同方式。例如仅计算它onCreate,然后在设定的时间间隔中使用CRON来更新值。聆听onWrite会导致每次将数据写入Firebase时发射功能。

您可以阅读有关Firebase数据库触发器的更多信息

警告:我的方法有点沉重,这可能需要对您的代码进行重构,因此绝对不是您的解决方案。但是我认为这仍然可能感兴趣您或将来的读者。


我通过使用"命令"(应该做的)和"事件"(发生了什么)来解决此问题。每个都有自己的集合,我的两个功能(a CommandsHandler和a EventsHandler)被订阅。

每个处理程序都处理命令和事件,并且可能会或可能不会根据他们所做的事情生成自己的事件和命令,从而使我完全绕过您描述的问题。

在您的情况下,它的行为如下:

更新

命令Update item 'Item' with 'blablabla'->事件Item 'Item' updated->命令Calculate property 'Property' for item 'Item'->事件Property 'Property' updated in item 'Item'

cron

cron函数触发 ->命令Calculate property 'Property' for item 'Item'->事件Property 'Property' updated in item 'Item'

相关内容

  • 没有找到相关文章

最新更新