代码之家  ›  专栏  ›  技术社区  ›  Moblize IT

Firebase函数抛出返回的未定义的预期承诺或值

  •  -1
  • Moblize IT  · 技术社区  · 7 年前

    我下面的firebase函数抛出返回未定义、预期承诺或值的错误函数。我到处都在做返回,不知道为什么它仍然抛出这个错误

    我已经查看了类似的代码示例,不确定它抛出错误的原因是什么。

    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不允许我发布只包含代码和添加文本的帖子。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Doug Stevenson    7 年前

    如果顶级条件为false,则不会从函数返回任何内容。让我把你的函数压缩一下,这样你就能看得更清楚了:

    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
        }
    )
    

    在任何情况下,你都需要归还一些东西。如果您的函数在主条件为false的情况下没有异步工作要做,只需 return null .

    作为一个更好的风格和清晰性的问题,你也可能希望把你的承诺连成链条,而不是把它们嵌套起来。嵌套的承诺很难理解,Linter可能会对此抱怨,因为它们也容易出错。

    推荐文章