db触发器引发的firebase函数引发的函数未定义,预期的承诺或值返回 [英] firebase function on db trigger throws Function returned undefined, expected Promise or value

查看:52
本文介绍了db触发器引发的firebase函数引发的函数未定义,预期的承诺或值返回的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我基于实时数据库触发器的firebase函数如下所示

my firebase function based on realtime database trigger looks like below

exports.on_user_created = functions.database.ref("/users/{id}")
    .onCreate((change, context) => {
        console.log("start of on_user_created ")   
        const user = change.val();
        console.log("New user:::" + JSON.stringify(user))

        const uid = user._uid
        const referralCode = user._referralCode

        console.log("creating referral node for uid:" + uid + " with code:" + referralCode)

        if(referralCode === undefined){
            console.error("No referral code created for the user while sign up. Referral node cannot be created.")    
            return true
        }


        var db = admin.database();
        var ref = db.ref('referrals')

        ref.child(referralCode).set({"uid": uid}).then(
            (resp) => {
                        console.log("referral node created")
                        return true
                      }
          ).catch(
            (err) => {
                      console.error("unable to create referral node on user create:" + err)    
                      return true  
            }
        )    
})

在运行时抛出

 5:47:02.035 AM on_user_created  Function returned undefined, expected Promise or value 

我不明白为什么

推荐答案

根据以下Doug的注释进行了调整:如果您没有异步工作要做,通常返回null"

这是因为您没有返回

This is because you don't return the Promise returned by the set() asynchronous operation.

您应该执行以下操作:

exports.on_user_created = functions.database.ref("/users/{id}")
    .onCreate((change, context) => {
        console.log("start of on_user_created ")   
        const user = change.val();
        console.log("New user:::" + JSON.stringify(user))

        const uid = user._uid
        const referralCode = user._referralCode

        console.log("creating referral node for uid:" + uid + " with code:" + referralCode)

        if(referralCode === undefined){
            console.error("No referral code created for the user while sign up. Referral node cannot be created.")    
            return null  // <-- See Doug's comment below.
        }

        var db = admin.database();
        var ref = db.ref('referrals')

        return ref.child(referralCode).set({"uid": uid}).then( // <-- !! Here we return
            (resp) => {
                        console.log("referral node created")
                        return null
                      }
          ).catch(
            (err) => {
                      console.error("unable to create referral node on user create:" + err)    
                      return null  
            }
        )    
})

请注意,如果不需要console.log(),例如,您可以按以下方式精简代码.用于生产.

Note that you could streamline your code as follows if you don't need the console.log()s, e.g. for production.

exports.on_user_created = functions.database.ref("/users/{id}")
    .onCreate((change, context) => { 
        const user = change.val();
        const uid = user._uid
        const referralCode = user._referralCode

        if (referralCode === undefined) {
            return null;
        } else {
            var db = admin.database();
            var ref = db.ref('referrals')

            return ref.child(referralCode).set({"uid": uid});
        }

});

有关在Cloud Function中返回承诺的重要性的更多详细信息,建议您观看官方视频系列,尤其是标题为"Learn JavaScript Promises"的视频: https://firebase.google.com/docs/functions/video-series/

For more detail on the importance of returning the promises in a Cloud Function, I would suggest you watch the official video series and in particular the ones titled "Learn JavaScript Promises": https://firebase.google.com/docs/functions/video-series/

这篇关于db触发器引发的firebase函数引发的函数未定义,预期的承诺或值返回的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆