node.js - Firebase 函数抛出返回的未定义、预期的 Promise 或值
问题描述
我下面的 firebase 函数抛出错误 Function returned undefined, expected Promise or value。我到处都在做退货,不知道为什么它仍然会抛出这个错误
我查看了类似的代码示例,但不确定它在哪一点引发错误。
exports.on_order_updated_update_new_vs_repeat_order = functions.database.ref("/orders/{id}")
.onUpdate((change, context) => {
const newValue = change.after.val();
const oldValue = change.before.val()
//if order is marked delivered then update the data
if(oldValue.order._orderStatus !== 'Delivered' && newValue.order._orderStatus === 'Delivered'){
//find the uid of the customer
const uid = newValue.customer._uid
var isOldOrder = false //to track weather the customer is new or repeat
var db = admin.database();
var ref = db.ref('users')
return ref.child(uid).child('orders').once("value").then(
(resp) => {
const orderKeys = Object.keys(resp.val())
if(orderKeys.length > 1)
isOldOrder = true //existing orders there so just set it to true
var date = new Date()
var begDate = findDayBegninning(date)
var endDate = findDayEnd(date)
var anaRef = db.ref('analytics')
return anaRef.child('newVsRepeatOrders').orderByChild("date").startAt(begDate).endAt(endDate).once("value").then(
(rp) => {
if(rp !== undefined && rp.val() !== null){
const newOldObj = rp.val()
var oldOrderVal = 0
var newOrderVal = 0
if(isOldOrder === true){
oldOrderVal = newOldObj[begDate].oldOrdersCount + 1
newOrderVal = newOldObj[begDate].newOrdersCount
}
return anaRef.child('newVsRepeatOrders/' + begDate).update({"oldOrdersCount": oldOrderVal, "newOrdersCount": newOrderVal}).then(
(resp1) => console.log("updated order count")
).catch(
(err) => console.error("error in updating old vs new order count:" + err)
)
}else{
console.log("no data found for today so adding first record")
var oldOrderCount = 0
var newOrderCount = 0
if(isOldOrder === true)
oldOrderCount++
else
newOrderCount++
var payload = {
"date" : begDate,
"oldOrdersCount": oldOrderCount,
"newOrdersCount" : newOrderCount
}
return anaRef.child('newVsRepeatOrders/' + begDate).set(payload).then(
(rpp) => console.log("updated newVsRepeatOrders")
).catch(
(err) => console.error("Error updating newVsRepeatOrders::" + err)
)
}
}
).catch(
(err) => console.error("Could not execute path newVsRepeatOrders for the customer uid:" + uid + " error is:" + err)
)
}
).catch(
(err) => console.error("Could not find orders for the customer uid:" + uid + " error is:" + err)
)
}
}
)
请忽略此处的文字。stackoverflow 不允许我发帖说我只有代码和添加文本。
解决方案
如果顶级条件为假,您不会从函数返回任何内容。让我把你的函数压缩一下,这样你就可以看得更清楚了:
exports.on_order_updated_update_new_vs_repeat_order = functions.database.ref("/orders/{id}")
.onUpdate((change, context) => {
const newValue = change.after.val();
const oldValue = change.before.val()
//if order is marked delivered then update the data
if(oldValue.order._orderStatus !== 'Delivered' && newValue.order._orderStatus === 'Delivered'){
// return some promise...
}
// nothing is returned if the above condition was false
}
)
在每种情况下,您都需要返回一些东西。如果您的函数在主要条件为假的情况下没有异步工作要做,那么只需return null
.
为了更好的风格和清晰度,您可能还希望链接您的 Promise 而不是嵌套它们。嵌套的 Promise 很难阅读,并且 linter 可能会抱怨这一点,因为它们也容易出错。
推荐阅读
- javascript - 添加事件监听器监听 keydown
- html - Bootstrap4 菜单项保持选中状态,只能点击一次
- spss-modeler - 如何运行流的一部分而不必执行整个流?
- hibernate - 在实体中休眠多个自然 ID
- javascript - 如何根据键匹配值将两个对象数组组合成一个数组
- asp.net-identity - 使用 .net 核心身份打印 Razor 页面中的所有用户名
- javascript - 如果您可以简单地执行 err.data.error.code,为什么还要使用 _.get(err, ['data', 'error', 'code'])?
- sas - (SAS)将函数作为参数传递给函数(或宏)
- python - Python - 如果 json.object 为空,重复该函数直到新值?
- java - 如何在 Web 项目中使用 Spring 5 的 RouterFunction?