【问题标题】:Firebase Function throws returned undefined, expected Promise or valueFirebase 函数抛出返回的未定义、预期的 Promise 或值
【发布时间】:2018-12-26 20:09:33
【问题描述】:

我下面的 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 不允许我发帖说我只有代码和添加文本。

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    如果顶级条件为假,您不会从函数返回任何内容。让我把你的函数压缩一下,让你看得更清楚:

    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 可能会抱怨这一点,因为它们也容易出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 2019-08-06
      • 2018-06-12
      • 2018-04-18
      • 2018-12-03
      • 2019-11-03
      • 2019-08-12
      相关资源
      最近更新 更多