使用Firebase云功能将值从一个节点复制到多个其他节点

时间:2017-10-25 03:37:13

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

我刚刚开始调查Firebase云功能,并且正在努力寻找在服务器端数据库节点之间复制数据的示例(扇出数据)。更具体地说,当特定用户(例如uid" PdXHgkfP3nPxjhstkhX")在/ users节点上更新URL(字典键" link")时,我想复制该值对该用户的所有实例"链接"在/ friendsList节点上。这是我到目前为止所拥有的。如果我接近错误的方式,请告诉我。

exports.fanOutLink = functions.database.ref('/users/PdXHgkfP3nPxjhstkhX/link').onWrite(event => {

friendsListRef = admin.database().ref('/friendsList');

//if there's no value
if (!event.data.val()){
    //TBD  
}else{
//when there is a value
    let linkURL = event.data.val()
    friendsListRef.once("value", function(snap)){
        snap.forEach(function(childSnapshot)){
           let childKey=childSnapshot.key; 
admin.database().ref('/friendsList/'+childKey+'/PdXHgkfP3nPxjhstkhX/link').set(event.data.val());
        }          
        }
    }
})

1 个答案:

答案 0 :(得分:1)

您没有返回承诺,这意味着云功能可能会在您的代码写入数据库之前终止您的代码,或者它可能使代码保持运行(从而向您收费)的时间超过需要的时间。我建议您详细了解here或观看this video

在您的情况下,简单的修复非常简单:

exports.fanOutLink = functions.database.ref('/users/PdXHgkfP3nPxjhstkhX/link').onWrite(event => {
    friendsListRef = admin.database().ref('/friendsList');

    if (!event.data.val()){
        return; // terminate the function  
    }else{
        let linkURL = event.data.val()
        return friendsListRef.once("value", function(snap)){
            var promises = [];
            snap.forEach(function(childSnapshot)){
               let childKey=childSnapshot.key; 
    promises.push(admin.database().ref('/friendsList/'+childKey+'/PdXHgkfP3nPxjhstkhX/link').set(event.data.val()));
            }          
            return Promise.all(promises);
        }
    }
})

您会发现我大多只是将once()的返回值和合并的set()调用通过我们的函数备份(和退出),以便云函数知道你什么时候完成这一切。

但请仔细研究帖子,视频和其他材料,因为这对编写云功能非常重要。

如果您不熟悉JavaScript,那么Cloud Functions for Firebase并不是学习它的最佳方式。我建议先阅读Firebase documentation for Web developers和/或Firebase codelab for Web developer。它们涵盖了许多基本的JavaScript,Web和Firebase交互。在那些之后,您也可以更好地为云功能编写代码。