使用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
相关产品推荐
相关产品推荐

