18

我正在查看 Firebase 的新云功能,它说在执行 OnWrite 时应注意不要将数据保存回同一个子级。(这将再次触发触发器)。

所以我想弄清楚,如何在记录上设置修改日期?

4

2 回答 2

19

问题不在于您不能或不应该更改数据,而在于您需要防范无限循环。例如,设置时间戳可以重新触发设置时间戳的函数,该时间戳将重新触发......等等。

但是,您可以做的是通过确保以幂等方式标记状态来保护您的代码,这样相同的代码就不会重新触发。例如:

exports.doThing = functions.database.ref('/events/{id}').onWrite(ev => {
  // prevent loops by guarding on data state
  if (ev.data.child('didThingAt').exists()) return;

  // do thing here...

  return ev.data.adminRef.update({
    didThingAt: admin.database.ServerValue.TIMESTAMP
  });
});
于 2017-03-12T07:27:45.140 回答
6

我了解 firebase 函数提供了一种更好的方法:

该方法是验证是否存在先前的事件。如果是这样,什么都不做,然后返回,你工作吗...此外,您可以验证项目是否正在被删除。

  if (event.data.previous.exists()) {
    return;
  }
  // Exit when the data is deleted.
  if (!event.data.exists()) {
    return;
  }

这是来自firebase 文档的完整示例。

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onWrite(event => {
      // Only edit data when it is first created.
      if (event.data.previous.exists()) {
        return;
      }
      // Exit when the data is deleted.
      if (!event.data.exists()) {
        return;
      }
// Grab the current value of what was written to the Realtime Database.
const original = event.data.val();
console.log('Uppercasing', event.params.pushId, original);
const uppercase = original.toUpperCase();
// You must return a Promise when performing asynchronous tasks inside a Functions such as
// writing to the Firebase Realtime Database.
// Setting an "uppercase" sibling in the Realtime Database returns a Promise.
return event.data.ref.parent.child('uppercase').set(uppercase);
于 2017-03-24T16:58:28.790 回答