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 的返回里。 克里斯托弗·诺兰作品《致命魔术》将重返影院
TP-Link Deco 7 Pro BE10000 Wi-Fi 7 全屋 Mesh 系统 6.4 折优惠现享
《自由足球怀旧服》大乱斗模式开启:强势中场登场:S3赛季任务及奖励重磅更新!
网易冷兵器新作《诡影藏锋》实机首曝:女鬼魅惑,恐怖拉满
炉石传说: Escape from Violet Hold 今日上线——探索游戏背后的人生哲理
亚马逊开启精选 4K 铁盒版促销:《回到未来》《侏罗纪世界》三部曲等作品迎来优惠