MongoDB 5搭配Node驱动4.2无法获取详细Schema校验错误如何解决
解决方案
前置问题排查
你当前收到的TypeMismatch错误和MongoDB 5的JSON Schema校验能力无关:该错误是插入接口传参格式错误导致,报错信息明确说明insert.documents.0是数组类型,不符合要求的object类型,说明你调用插入方法时给的待插入文档外层多套了一层数组,例如错误写法为insertOne([{字段: 值}]),修正为insertOne({字段: 值})即可解决该报错。
你需要先修正传参问题,才能触发真正的JSON Schema校验失败错误,该错误对应错误码为121,CodeName为DocumentValidationFailure。
获取完整校验错误详情的配置要求
1. 服务端集合校验规则配置
创建或修改集合时,要确保校验规则配置如下:
db.createCollection("你的集合名称", { validator: { $jsonSchema: { // 此处填写你的JSON Schema规则 } }, // 必须设为strict,默认值为strict,若之前修改过需要改回 validationLevel: "strict", // 必须设为error,默认值为error,设为warn只会打印日志不会抛出校验错误 validationAction: "error" })
注意必须确认服务端MongoDB版本为5.0及以上,低版本不支持返回详细校验错误的能力
2. Node.js驱动操作参数配置
使用MongoDB Node驱动执行插入、更新等写操作时,必须额外传入includeResultMetadata: true的配置项,示例:
// 插入单条文档示例 await collection.insertOne(待插入文档对象, { includeResultMetadata: true }) // 更新单条文档示例 await collection.updateOne({ _id: 目标文档ID }, { $set: 更新内容 }, { includeResultMetadata: true })
3. 错误详情获取方式
捕获到校验失败错误后,从错误对象的errInfo.details字段即可获取完整的校验失败明细,包含所有不满足的规则、对应字段路径、错误原因,示例捕获代码:
try { // 假设Schema要求name字段为字符串类型,此处传入数字触发校验失败 await collection.insertOne( { name: 123 }, { includeResultMetadata: true } ) } catch (err) { // JSON Schema校验失败的错误码固定为121 if (err.code === 121) { // 输出完整的校验错误详情 console.log('校验失败明细:', err.errInfo.details.schemaRulesNotSatisfied) } else { // 其他类型错误(如传参格式错误、权限错误等)按原有逻辑处理 throw err } }
内容的提问来源于stack exchange,提问作者Léo Martin
相关产品推荐
相关产品推荐

