当前位置: 首页 > 知识库问答 >
问题:

带实时数据库触发器的Firebase云功能:如何更新源节点?

闻人飞白
2023-03-14

我正在尝试编写一个云函数,该函数可以执行以下操作:

  1. 在'posts/{postid}/comments/{commentsid}/‘节点中收听一个新的创建。(这是通过前端代码中的数据库推送完成的)。此节点将在“uid”子节点下具有评论者的uid。
  2. 使用子节点中的uid,在“users/uid”节点中查找评论者的用户名、昵称和配置文件图片,并记录它们。
  3. 使用用户名、昵称和配置文件图片的相关子节点更新“posts/{postid}/comments/{commentsid}/”节点。

下面的代码工作良好,直到最后一个部分尝试做的工作。3.错误消息为“函数返回未定义、预期promise或值”。

我认为这是Firebase特有的语法问题。谁能给我指出做这个任务的正确语法吗?

多谢!

 exports.commentsupdate = functions.database.ref('posts/{postid}/comments/{commentsid}/')
  .onCreate((snapshot,context) => {
     const uid=snapshot.val()['uid'];
     let username="";
     let nickname="";
     let profile_picture="";
     const ref1=database.ref('users/'+uid);
     ref1.once('value',function(ssnapshot){
        username=ssnapshot.val()['username'];
        nickname=ssnapshot.val()['nickname'];
        profile_picture=ssnapshot.val()['profile_picture'];
     }).then(()=>{
        return snapshot.ref.update({
           username:username,
           nickname:nickname,
           profile_picture:profile_picture
       })
    })
});

共有1个答案

淳于玺
2023-03-14

您需要返回promise链中的第一个promise,即once()方法返回的promise,如下所示:

exports.commentsupdate = functions.database.ref('posts/{postid}/comments/{commentsid}/')
    .onCreate((snapshot, context) => {

        const uid = snapshot.val()['uid'];
        let username = "";
        let nickname = "";
        let profile_picture = "";

        const ref1 = database.ref('users/' + uid);

        return ref1.once('value')   // <--- Note the return here
            .then(snapshot => {
                username = snapshot.val()['username'];
                nickname = snapshot.val()['nickname'];
                profile_picture = snapshot.val()['profile_picture'];

                return snapshot.ref.update({
                    username: username,
                    nickname: nickname,
                    profile_picture: profile_picture
                })

            })

    });
 类似资料:
  • 实时数据库触发器在写入创建时是排队还是线程化?

  • 有没有办法在触发云功能之前检查用户是否经过Firebase授权?(或在函数内)

  • 我正在寻找一种为Firebase安排云功能的方法,或者换句话说,在特定的时间触发它们。

  • 在我的项目中,我使用实时数据库以及Firestore数据库。当一个文档被添加到Firestore数据库中的特定集合时,我的云函数会触发。然后该函数写入我的实时数据库以更新一些统计信息。我注意到,即使没有用户连接到我的实时数据库,当云函数写入实时数据库时,并发连接的数量也会增加。这是否意味着我的云功能被视为并发连接,并将减少可以同时连接到我的实时数据库的用户数,因为有100k并发连接的限制?

  • 通过这篇博客,我可以看到我的应用程序最好使用Firebase Firestore的Firebase云功能,而不是使用客户端SDK直接访问Firestore。 我可以使用实现Firestore读取操作,使用或&使用方法实现写入操作。所有这些一次性操作都很好。 是否可以实现来获取实时更新?如果是,怎么做?