UnhandledPromiseRejectionWarning:未处理的承诺拒绝 - Node.js

UnhandledPromiseRejectionWarning: Unhandled promise rejection - Node.js

我在异步函数中分离了验证模块。但它并没有抛出注定的错误,而是给出 UnhandledPromiseRejectionWarning: Unhandled Promise Rejection。这个错误要么是在没有 catch 块的情况下抛出异步函数内部,要么是拒绝了一个没有用 .catch() 处理的承诺。

这是验证函数:

let pickupDateAndTimeValidation = async (order) => {

  try {
    const isPickupToday = order.pickupDate === order.orderDate
    order.orderTime = helper.convertTime12to24(order.orderTime);
    const pickupDate = helper.dateFromMMDDYYYYString(order.pickupDate)
    order.pickupDate = pickupDate.toISOString().split('T')[0]
    order.pickupSlotStartTime = helper.convertTime12to24(order.pickupSlotStartTime)
    order.pickupSlotEndTime = helper.convertTime12to24(order.pickupSlotEndTime)

    const pickupSlotStartTime = helper.dateFromTimeString(order.pickupSlotStartTime, pickupDate)

    const firstAvailableSlot = isPickupToday
      ? await getFirstAvailableSlotAfterTime(order.storeID, helper.getDayOfWeek(pickupDate), order.orderTime)
      : await getFirstAvailableSlotOfDay(order.storeID, helper.getDayOfWeek(pickupDate))
    if (!firstAvailableSlot)
      throw helper.conflict("Selected pickup slot is no longer available.")

    order.storeSlotID = firstAvailableSlot.slotID

    const orderSlotStartTime = helper.dateFromTimeString(firstAvailableSlot.slotStartTime, pickupDate)
    if (pickupSlotStartTime < orderSlotStartTime)
      throw helper.conflict("Selected pickup slot is no longer available.")
    
  } catch (error) {
    throw error
  }
    
}


我在这里调用这个函数:

const editOrder = async (updatedOrder, orderNumber) => {
  // if (updatedOrder.orderDate !== undefined || updatedOrder.orderTime !== undefined)
  //   throw helper.badRequest("Order date and time cannot be changed.")

  if (updatedOrder.pickupSlotStartTime)
    updatedOrder.pickupSlotStartTime = helper.convertTime12to24(updatedOrder.pickupSlotStartTime)

  if (updatedOrder.pickupSlotEndTime)
    updatedOrder.pickupSlotEndTime = helper.convertTime12to24(updatedOrder.pickupSlotEndTime)

  pickupDateAndTimeValidation(updatedOrder);

  const updateQuery = "UPDATE `transaction` SET ? WHERE orderNumber = ?;"

  try {
    await helper.runQuery(updateQuery, [updatedOrder, orderNumber])
  } catch (error) {
    if (error.errno === 1064 || error.errno === 1054)
      throw helper.badRequest()
    else
      throw error
  }

  return findOrder('orderNumber', orderNumber)
};


任何帮助将不胜感激,为什么这在 editOrder 函数中起作用而不是在单独的函数中起作用。谢谢

pickupDateAndTimeValidation 是一个 return 承诺的函数(异步函数 return 承诺)。如果异步函数抛出异常,则该承诺将被拒绝。如果承诺被拒绝,则必须处理该拒绝,否则您将收到 UnhandledPromiseRejection 错误。

所以你的代码中的问题是你的 promise-returning 函数抛出异常,但你没有处理它。看看验证函数是怎么调用的:

const editOrder = async (updatedOrder, orderNumber) => {
  // ...

  pickupDateAndTimeValidation(updatedOrder);

  // ...
};

就是这样。您已经调用了 promise-returning 函数,但是您还没有围绕它设置任何类型的错误处理。因此,要么使用承诺符号来处理错误,例如pickupDateAndTimeValidation(updatedOrder).catch(err => ...) 或者,因为这是一个异步函数,所以在 try/catch 块中对其使用 await 来捕获该函数抛出的任何错误。