Jest测试删除接口预期返回404却收到500错误排查求助
问题根因
Mongoose的findByIdAndRemove方法会先校验传入ID的格式是否符合MongoDB ObjectId规范,格式非法时会直接抛出异常,而非返回空值。你当前的代码没有对该异常做捕获处理,所以直接触发服务端内部错误返回500状态码。
你测试用例中传入的ID是数字1,完全不符合合法ObjectId的要求(合法MongoDB ObjectId需为24位十六进制字符串,或12字节二进制值),因此直接触发了方法抛错。
修复方案
你可以根据业务需求选择以下任意一种方案修复:
- 方案1:在接口层新增ID格式校验+异常捕获逻辑,适配非法格式ID的处理场景
const mongoose = require('mongoose'); router.delete('/:id',[endpoint_middleware,admin_middleware], async (req, res) => { // 先校验ID格式合法性 if (!mongoose.Types.ObjectId.isValid(req.params.id)) { return res.status(404).send('The genre with the given ID was not found.'); } try { const doc_to_delete = await CollectionClass.findByIdAndRemove(req.params.id); if (!doc_to_delete) return res.status(404).send('The genre with the given ID was not found.'); res.send(doc_to_delete); } catch (err) { res.status(500).send('Server internal error'); } });
- 方案2:修改测试用例,将无效ID替换为格式合法但不存在的ID
it('return error for deleting invalid id', async () => { // 生成合法但不存在的ObjectId id = new mongoose.Types.ObjectId().toString(); const response = await delete_genre(); expect(response.status).toBe(404); });
内容的提问来源于stack exchange,提问作者nandhini
相关产品推荐
相关产品推荐

