Firebase的云功能多次调用

Var*_*pta 8 firebase firebase-realtime-database google-cloud-functions

我正在尝试使用Firebase的云功能,以便将我的firebase-queue工作人员转移到云功能.每当我在给定的ref创建一个新节点时,我添加了一个简单的函数来添加最后更新的时间戳.该函数如下所示:

var functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.setLastUpdatedTimestamp = functions.database.ref('/nodes/{nodeId}')
  .onWrite(event => {
    const original = event.data.val();
    console.log('Adding lastUpdatedTimestamp to node ', original.name);
    return event.data.ref.child('lastUpdatedAtFromFC').set(Date.now());
  });
Run Code Online (Sandbox Code Playgroud)

我部署了这个云功能,并从我的应用程序中添加了一个节点.我转到Firebase Functions仪表板,看到该函数已被调用169次,我不明白为什么.当我查看日志时,我会看到日志,例如将函数附加到所有过去的节点.

是否onWrite会出现类似的情况child_added并为所有现有实体运行该功能?

每当我再次更改和部署该功能时,是否会重复此操作?

我期待它只为新添加的节点运行一次.

Rob*_*man 9

道格是正确的.另外,最好知道如果你有一个函数卡在无限循环中,让它停止的方法是重新部署你的函数(使用firebase deploy)和循环修复,或者完全删除函数(通过从你的index.js和正在运行中删除它firebase deploy).

  • 真的希望有一种方法可以在将来通过管理门户禁用功能.. :) (3认同)

Dou*_*son 8

编写处理数据库写入的函数时,这是一个常见的错误.当你在一个位置处理初始写入的事件时,再做一次写回到同一个位置,第二次写入将触发另一个将再次运行该函数的事件,依此类推,这将是一个无限循环.

您需要在函数中使用一些逻辑来确定第二个写事件是否不应该重写到数据库.这将阻止循环.在您的情况下,您不需要函数来设置上次更新时间.您可以在客户端上使用特殊值来指示服务器将当前时间插入字段.

https://firebase.google.com/docs/reference/js/firebase.database.ServerValue#.TIMESTAMP