我刚刚开始调查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());
}
}
}
})
答案 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交互。在那些之后,您也可以更好地为云功能编写代码。