javascript - 使用 Firebase Cloud Functions 将值从一个节点复制到多个其他节点

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

我刚刚开始研究 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/

相关文章:

javascript - 错误连接 MongoDB : Error: Route. get() 需要一个回调函数,但得到一个 [对象未定义]

javascript - 未捕获的类型错误 : Cannot read property 'style' of undefined error

ios - Firebase 云消息传递 iOS : No background push notification

firebase - 在 Firestore 数据库中一次执行 500 多项操作

android - 如何减少firebase中的数据库大小?

javascript - Backbone.js:用一个请求加载多个集合

javascript - V8 引擎如何处理添加属性的排序?

javascript - 如何从 web 中的 firebase 获取特定值或行数据

ios - GeoFire Swift 3 - 保存和更新坐标

javascript - Firebase 实时数据库 - 查找和更新