一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Node.js项目中如何优雅捕获MongoDB写入异常

时间:2026-07-08 10:36:46 编辑:袖梨 来源:一聚教程网

insertMany 写入失败时抛出多种错误:MongoWriteConcernError、MongoBulkWriteError、MongoServerError(含 code 如 11000)或原生 Error;需通过 error.code 和 error.writeErrors 判断具体原因,而非 error.name。

写入失败时 insertMany 抛什么错误?

它不抛统一的 MongoServerError,而是根据失败原因返回不同构造的错误对象:MongoWriteConcernError(写关注未满足)、MongoBulkWriteError(批量写入中部分失败)、MongoServerError(含 code 字段,如 11000 表示重复键)、或原生 Error(如网络中断)。关键不是看 error.name,而是查 error.codeerror.writeErrors(对 insertMany 尤其重要)。

为什么 try/catch 捕不到“控制台没输出”?

常见于模型变量名引用错误,比如导入了 const Model = require("./models/match"),却在路由里写 await Match.insertMany(...)。这会直接触发 ReferenceError: Match is not defined,属于同步语法错误,try/catch 无法捕获——整个 async 函数体根本没执行到 await 那一步,console.log("Trying to get data") 自然不会打印。

  • 检查所有模型使用是否与 require 的变量名完全一致
  • 确保 Model 已正确导出且无拼写/大小写差异
  • catch 块里加 console.error(error.stack),而非只打 error.message

insertMany 部分失败时怎么拿到具体哪几条错了?

insertMany 默认遇到第一条错误就中断(ordered: true),但你可以设 ordered: false 让它继续执行,并通过 error.writeErrors 数组拿到每条失败项的索引、错误码和详情:

try {  const result = await Model.insertMany(data, { ordered: false });} catch (error) {  if (error.writeErrors) {    error.writeErrors.forEach(({ index, code, errmsg }) => {      console.warn(`第 ${index} 条数据写入失败(code ${code}):`, errmsg);    });  }}
  • code: 11000 表示唯一键冲突,通常需去重或改用 updateOne + upsert
  • code: 121 是验证失败,检查 schema 中的 requiredvalidate 规则
  • ordered: false 不影响成功项的插入,但错误堆栈更长,生产环境建议配合日志采样

事务中写入失败,commitTransaction 还会执行吗?

不会。commitTransaction 只在显式调用时触发;如果某次 collection.insertOne 失败并抛错,驱动会自动 abort 当前事务,commitTransaction 根本不会走到。你真正能拿到错误码的地方只有两个:CRUD 操作本身(如 insertOnecode: 133 写冲突),或显式 commitTransaction 调用点(报 code: 112251)。

  • 别在 catch 里假设“事务已提交”,要检查 session.inTransaction() 状态
  • code: 112 不代表写冲突(那是 133),它更可能是会话过期或事务超时,需结合 error.errorLabels?.includes('TransientTransactionError') 判断是否可重试
  • 事务内任何操作超时(如 maxTimeMS 设置过短),错误发生在具体命令层,code: 50MaxTimeMSExpired),不是 commit 阶段的问题
事务写入异常的根因往往不在 commit 那一刻,而在你第一次调用 insertOneupdateMany 的瞬间——错误码藏在那里,而不是在 commitTransaction 的返回里。

热门栏目