firebase云功能事务偶尔工作

时间:2017-06-11 08:46:51

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

我有这样的云功能:

exports.updateNewsCount = functions.database.ref('/channels/{channelId}/news/{newsId}/') 
.onWrite (event => {
    const channelId = event.params.channelId;
    const newsId = event.params.newsId;
    let CntRef = admin.database().ref('/channelDetails/' + channelId + '/newsCnt');
    if (event.data.exists() && !event.data.previous.exists()){
        return CntRef.transaction(function(current){
            if (current){
                console.log ('current is not null');
                return (current || 0) + 1;
            }
            else {
                console.log('current is null');
                return current;
            }
        },function(error, b, d){
            if (error) 
                console.log(error);
            else 
                console.log ('error is null');
            if (b)
                console.log('boolean is true');
            else
                console.log('boolean is false');

            if (d)
                console.log('snapshot is ' + d);
            else
                console.log ('snapshot is null');
        }).then(()=>{});
    } else if (!event.data.exists() && event.data.previous.exists()){
        return CntRef.transaction(function(current){
            if (current)
                return (current || 1) - 1;
            else
                return current;
        }, function(error, b, d){if (error) console.log(error); if (d) console.log(d);}).then(()=>{});
    }
});

随着我可以看到日志条目,它会一直闪烁。但是,newsCnt字段未按预期更新。有时它会更新,有时不会!我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您应该期望可能多次调用事务,第一次使用null。交易的方式就是这样。请阅读文档here

特别注意该部分中的以下标注:

  

注意:因为您的更新函数被多次调用,所以必须这样做   能够处理空数据。即使您的现有数据存在   远程数据库,它可能不会在事务时本地缓存   函数运行,导致初始值为null。