我刚刚开始研究 Firebase Cloud Functions,并且正在努力寻找在服务器端的数据库节点之间复制数据(扇出数据)的示例。更具体地说,当特定用户(例如 uid“PdXHgkfP3nPxjhstkhX”)更新/users 节点上的 URL(字典键“link”)时,我想将该值复制到该用户的“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());
}
}
}
})
最佳答案
您没有返回 promise ,这意味着 Cloud Functions 可能会在您的代码写入数据库之前终止您的代码,或者它可能会使其运行时间(从而向您收取费用)超过所需的时间。我建议阅读更多相关内容 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()
调用备份(并传出)我们的函数,以便 Cloud Functions 知道您何时完成所有操作。
但是请仔细研究帖子、视频和其他 Material ,因为这是编写云函数的基础。
如果您一般不熟悉 JavaScript,Cloud Functions for Firebase 并不是学习 JavaScript 的最佳方式。我建议首先阅读Firebase documentation for Web developers和/或采取 Firebase codelab for Web developer 。它们涵盖了许多基本的 JavaScript、Web 和 Firebase 交互。之后,您也将能够更好地为 Cloud Functions 编写代码。
关于javascript - 使用 Firebase Cloud Functions 将值从一个节点复制到多个其他节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46923545/