node.js - 使用 forEach 循环处理 mongoose 的错误
问题描述
我有一个带有 express 的 mongodb,Cannot set headers after they are sent to the client. Unhandled promise rejections are deprecated
在执行以下操作时出现错误。
exports.deleteBooking = (req, res, next) => {
req.body.courts.forEach(element => {
Booking.deleteOne({$and: [
{ cid: element.cid },
{ year: element.day.year }
]})
.then(result => {
res.status(201).json({
message: result
});
})
.catch(() => {
res.status(500).json({
error: 'error'
})
});
})
};
我正在向我的服务器发送一组对象,并希望对每个对象执行一次删除。
因为forEach
它可能会在标头发送到客户端后运行 .catch。使用 forEach 循环.then
的正确处理方法是什么?.catch
谢谢!
编辑:我忘了补充一点,如果我删除.then
并且.catch
查询仍然会运行,并且没有错误。但我想在这种情况下保留错误处理。
解决方案
res.status(201).json
是在forEach
循环中,因此为什么会出现上述错误:您只能发送一次数据。
要解决这个问题,您基本上需要发送deleteOne
一次操作并使用bulkWrite()
它,因为它允许您在一个命令中向 MongoDB 服务器发送多个 deleteOne 操作。它以对象数组的形式接受输入,如下所示
Booking.bulkWrite([
{ deleteOne: { filter: { cid: 1, year: 2007 } } },
{ deleteOne: { filter: { cid: 2, year: 2007 } } },
{ deleteOne: { filter: { cid: 3, year: 2007 } } },
{ deleteOne: { filter: { cid: 4, year: 2007 } } },
])
因此,在您的情况下,您可以将req.body.courts
数组映射到上述deleteOne
操作
exports.deleteBooking = (req, res, next) => {
Booking.bulkWrite(
req.body.courts.map(({ cid, day }) => ({
deleteOne: { filter: { cid, year: day.year } }
}))
).then(message => {
res.status(201).json({ message })
}).catch(error => {
res.status(500).json({ error })
})
}
推荐阅读
- c++ - MFC GetDC() 断言失败 - “不是窗口”
- c++ - QPainter 正在绘制矩形但不显示矩形框
- python - 删除多个列表python中的两个重复项
- c# - mysql 和 c# - 将日期与今天进行比较(只是当天)
- visual-studio - CView 作为 CMFCTabCtrl 上的选项卡,不绘制无效区域(在拖动时)
- c++ - c ++播放器与SFML的碰撞
- r - 如何使用 R 将数据帧转换为矩阵
- python-3.x - 如何通过 selenium webdriver 和 python 切换到另一个 TAB?
- apache - Apache2 - HTTP POST 请求被重定向到 GET
- java - java Float.MAX_VALUE 到 Double