You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:51:00