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 来捕获该函数抛出的任何错误。
我在异步函数中分离了验证模块。但它并没有抛出注定的错误,而是给出 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 来捕获该函数抛出的任何错误。