最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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.code 和 error.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 中的required或validate规则 -
ordered: false不影响成功项的插入,但错误堆栈更长,生产环境建议配合日志采样
事务中写入失败,commitTransaction 还会执行吗?
不会。commitTransaction 只在显式调用时触发;如果某次 collection.insertOne 失败并抛错,驱动会自动 abort 当前事务,commitTransaction 根本不会走到。你真正能拿到错误码的地方只有两个:CRUD 操作本身(如 insertOne 报 code: 133 写冲突),或显式 commitTransaction 调用点(报 code: 112 或 251)。
- 别在
catch里假设“事务已提交”,要检查session.inTransaction()状态 -
code: 112不代表写冲突(那是133),它更可能是会话过期或事务超时,需结合error.errorLabels?.includes('TransientTransactionError')判断是否可重试 - 事务内任何操作超时(如
maxTimeMS设置过短),错误发生在具体命令层,code: 50(MaxTimeMSExpired),不是 commit 阶段的问题
insertOne 或 updateMany 的瞬间——错误码藏在那里,而不是在 commitTransaction 的返回里。
相关文章
- 王者荣耀世界东方曜与鲁班大师配队培养方法 07-08
- 鸣潮2.5:优化了哪些方面 07-08
- 星际裂变新手前期如何探索废墟 07-08
- 这城有良田威仪属性解析 07-08
- 指尖无双治安亭任务挑选攻略 07-08
- 《心动小镇》烹饪玩法技巧分享 07-08