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

使用MongoDB Insert Many后Node.js出现ERR_HTTP_INVALID_STATUS_CODE错误

问题分析

你遇到的错误ERR_HTTP_INVALID_STATUS_CODE: Invalid status code: 11000,根源是MongoDB的重复键错误码被当作HTTP状态码返回。

当批量插入的文档中存在重复的唯一键(比如用户名、邮箱)时,MongoDB会抛出错误,其code字段为11000。你的代码直接将这个err.code传给res.status(),但HTTP状态码的合法范围是100-599,11000不在此范围内,因此Express抛出了这个错误。

数据能成功写入数据库,是因为insertMany默认在遇到错误时会继续插入后续不冲突的文档(若未设置ordered: true,默认ordered: true场景下,可能是部分文档插入成功后才触发重复错误)。

解决方案

修改catch块中的错误处理逻辑,将MongoDB的11000错误码映射为合法的HTTP状态码(推荐用409 Conflict,表示资源冲突):

async registerBulks(req, res) {
    try {
      let salt = await bcrypt.genSalt(10);
      let hash = await bcrypt.hash("nabatiUser", salt);

      const datas = req.body.data;
      const newUser = datas.map((obj) => ({
        ...obj,
        password: hash,
        role: "user",
      }));

      const user = await User.insertMany(newUser);

      if (!user) {
        throw { code: 500, message: "USER_REGISTER_FAILED" };
      }
      return res.status(200).json({
        status: true,
        message: "USER_REGISTER_SUCCESS",
      });
    } catch (err) {
      // 处理MongoDB重复键错误及其他异常
      let statusCode = 500;
      let errorMessage = err.message;
      
      if (err.code === 11000) {
        statusCode = 409;
        errorMessage = "DUPLICATE_USER: 存在重复的用户数据";
      } else if (err.code && err.code >= 100 && err.code <= 599) {
        statusCode = err.code;
      }

      return res.status(statusCode).json({
        status: false,
        message: errorMessage,
      });
    }
  }
关键修改点
  • 新增对err.code === 11000的判断,将其映射为HTTP 409状态码,并自定义更清晰的错误提示
  • 确保传给res.status()的始终是合法的HTTP状态码(100-599之间)

内容的提问来源于stack exchange,提问作者JS24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:25:40