如何在asyncHandler中处理消息错误?任务不存在时返回对应提示
问题说明
测试更新API接口时,就算更新的任务不存在,接口仍然返回成功提示:
{ "msg": "Task Updated Successfully", "data": null }
目前的删除任务控制器代码:
const deleteTask = asyncHandler(async (req, res) => { const tasks = await taskModel.findByIdAndDelete(req.params.id); res.status(200).json({ msg: "A Task Deleted Successfully", data: "" }); });
错误处理中间件代码:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Internal Server Error'); });
需要实现两个需求:
- 当任务不存在时,返回对应的失败提示
- 正确处理
asyncHandler抛出的错误
解决方案
1. 修改删除任务控制器,判断任务是否存在
findByIdAndDelete方法在找不到对应ID的任务时会返回null,借助这个特性添加判断逻辑:
const deleteTask = asyncHandler(async (req, res) => { const task = await taskModel.findByIdAndDelete(req.params.id); // 任务不存在的情况 if (!task) { return res.status(404).json({ msg: "指定任务不存在,删除失败", data: null }); } // 任务存在且删除成功的情况 res.status(200).json({ msg: "任务删除成功", data: task }); });
2. 优化错误处理中间件,处理asyncHandler捕获的错误
asyncHandler会把异步函数中的错误自动传递给Express的错误中间件,我们可以针对不同错误类型返回更精准的提示:
app.use((err, req, res, next) => { console.error(err.stack); // 处理MongoDB的无效ObjectID格式错误 if (err.name === 'CastError' && err.kind === 'ObjectId') { return res.status(400).json({ msg: "无效的任务ID格式", data: null }); } // 处理自定义业务错误(如果手动抛出的话) if (err.statusCode) { return res.status(err.statusCode).json({ msg: err.message, data: null }); } // 其他未知错误返回500 res.status(500).json({ msg: "服务器内部错误", data: null }); });
3. 同步修复更新接口的问题
更新接口的逻辑和删除类似,修改更新控制器即可:
const updateTask = asyncHandler(async (req, res) => { // { new: true } 返回更新后的文档,runValidators启用参数校验 const task = await taskModel.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true }); if (!task) { return res.status(404).json({ msg: "指定任务不存在,更新失败", data: null }); } res.status(200).json({ msg: "任务更新成功", data: task }); });
内容的提问来源于stack exchange,提问作者Waseem Wisa
相关产品推荐
相关产品推荐

