我使用Cloud Functions for Firebase来执行某些服务器端任务。使用数据库触发器onWrite()
我遇到了一些意想不到的行为。
exports.doStuff = functions.database.ref('/topic/{topicId}/new').onWrite((event) => {
// If data, then continue...
if (event.data.val()){
// doStuff
//
} else {
console.log("started, but no content!");
}
当新数据添加到指定文件夹时,该功能至少启动一次,没有任何新内容(“已启动,但没有内容!”记录到控制台)。有时甚至两三次或四次。然后它会自动再次运行(几秒钟后),这次一切都按预期运行。
修改
写入指定节点的代码如下:
functionA(topicId){
return this.db.object('/topic/'+topicId+'/new').update({
timestamp: firebase.database.ServerValue.TIMESTAMP
});
}
时间戳只设置一次。因此,在调用该操作之前,节点new
不存在。所以没有编辑或删除。但是,这意味着,通过首先调用上述函数,创建节点new
,稍后几毫秒timestamp
,然后创建timestamp
的值。 Firebase是否为每个事件调用onWrite()函数?
这对任何人都有意义吗?任何想法如何确保只有当有新数据可用时才执行该功能?
答案 0 :(得分:0)
您的原始代码基于教程或Firebase早期Beta版的帮助。
exports.doStuff = functions.database.ref('/topic/{topicId}/new')
.onWrite((event) => {
if (event.data.val()){
// do stuff
}
}
但是,从1.0版开始,onWrite
函数中的第一个参数是一个“更改”对象,它具有两个属性:before
和after
。您需要after
。您可以按以下方式获取它:
exports.doStuff = functions.database.ref('/topic/{topicId}/new')
.onWrite((change) => {
if (change.after.val()){
// do stuff
}
}
来源:https://firebase.google.com/docs/reference/functions/functions.Change