Firebase的云功能:onWrite()在没有新数据的情况下执行

时间:2017-06-07 14:01:06

标签: firebase firebase-realtime-database google-cloud-functions

我使用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()函数?

这对任何人都有意义吗?任何想法如何确保只有当有新数据可用时才执行该功能?

1 个答案:

答案 0 :(得分:0)

从Firebase SDK的1.0版开始,

onWrite()具有新格式

您的原始代码基于教程或Firebase早期Beta版的帮助。

exports.doStuff = functions.database.ref('/topic/{topicId}/new')
.onWrite((event) => {

    if (event.data.val()){
        // do stuff
    }
}

但是,从1.0版开始,onWrite函数中的第一个参数是一个“更改”对象,它具有两个属性:beforeafter。您需要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