作者:落陌_漾吇 | 来源:互联网 | 2023-02-09 11:52
我正在研究Firebase的新云功能,它说在进行OnWrite时你应该注意不要将数据保存回同一个Child.(这将再次触发触发器).
所以我想弄清楚,如何在记录上设置修改日期?
1> Michael Blei..:
问题不在于您不能或不应该更改数据,而是需要防范无限循环.例如,设置时间戳可能会重新触发设置时间戳的功能,该时间戳将重新触发......等等.
但是,您可以通过确保以幂等方式标记状态来保护代码,以便相同的代码不会重新触发.例如:
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
});
});
如果一个字段多次更新/递增(例如,每次采取操作时递增一个计数器),是否有办法让该函数仅增加该字段一次,并识别该字段已更新而不再执行?我唯一能想到的是在不同的表引用上有函数.onWrite事件..并调用另一个函数来分别更新包含递增字段的表.
2> Juan Pablo..:
我理解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);