db触发器引发的firebase函数引发的函数未定义,预期的承诺或值返回 [英] firebase function on db trigger throws Function returned undefined, expected Promise or value
问题描述
我基于实时数据库触发器的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屋!