Firebase可调用云函数返回值/对象始终为null问题咨询
问题原因
核心是云函数内异步操作的返回值没有正确传递给云函数框架,具体有两个错误点:
- 没有返回
update操作的Promise,且混用回调写法导致返回值失效
当进入snapshot.val()[type] === true分支时,你执行了实时数据库的update操作,但没有return这个异步操作的Promise,同时你把返回{is_valid}的逻辑写在了update的回调函数中,回调的返回值无法被外层的then捕获,导致这个分支下外层then没有明确返回值,云函数框架就会默认返回null。 - 动态属性名语法错误
代码中[[path]]的写法是错误的,ES6动态属性名仅需要单组方括号[path],错误的语法会导致update操作参数异常,进一步加剧返回值异常问题。
修正后的云函数代码
exports.useVoucher = functions.https.onCall((data, context) => { const type = data.type const voucher_code = data.voucher_code const current_time = data.current_time console.log("useVoucher type is ", type + " and voucher_code is ", voucher_code) return admin.database().ref().child("vouchers").child(voucher_code).once("value").then((snapshot) => { if (snapshot.exists()) { console.log("useVoucher snapshot is ", snapshot.val()); if (snapshot.val()[type] === true) { let path = "vouchers/" + voucher_code + "/" + type // 新增return返回update的Promise,改用Promise链式写法替代回调,修正动态属性名 return admin.database().ref().update({ [path]: current_time }).then(() => { console.log("useVoucher succeeded") return {is_valid: true} }).catch(error => { console.log("useVoucher failed", error) return {is_valid: false} }) } else { console.log("useVoucher voucher found but type not found or not true") return {is_valid: false} } } else { console.log("useVoucher voucher_code is not valid"); return {is_valid: false} } }) })
补充说明
Firebase的onCall云函数要求所有异步操作都必须显式返回对应的Promise,确保云函数会等待异步逻辑执行完成后再把结果返回给客户端,不会提前终止执行。客户端的调用逻辑没有问题,云函数修正后即可正常拿到返回的is_valid字段。
内容的提问来源于stack exchange,提问作者TheNomadicAspie
相关产品推荐
相关产品推荐

