node-ottoman中findOne方法DocumentNotFoundError及enforceRefCheck问题咨询
问题解答
1. 为什么enforceRefCheck被忽略?
enforceRefCheck的作用是验证模型中引用字段(ref类型)指向的文档是否存在,它和findOne方法找不到目标文档时的错误行为没有关联。
举个实际场景:如果你的模型定义了user字段并指定为ref('User'),当创建/更新该模型的文档时,enforceRefCheck=true会强制校验对应的User文档是否存在;但它不会改变findOne本身的查询逻辑——findOne找不到匹配文档时抛出DocumentNotFoundError是默认行为,和这个配置完全无关,不存在“被忽略”的情况,是对该属性的作用范围理解有误。
2. Ottoman 2.4.0版本中如何忽略DocumentNotFoundError?
有两种可靠方式实现需求:
方式一:使用throwOnNotFound选项
调用findOne时,通过第三个参数(配置选项)设置throwOnNotFound: false,找不到文档时方法会返回null而非抛出错误:
const targetDoc = await YourModel.findOne( { _id: '目标文档ID' }, // 查询条件 {}, // 投影字段(可选) { throwOnNotFound: false } // 配置选项 ); // 找不到时targetDoc为null,无需额外处理错误
方式二:捕获特定错误
若因版本兼容问题无法使用上述选项,可通过try/catch包裹调用,仅忽略DocumentNotFoundError,其他错误正常抛出:
let targetDoc; try { targetDoc = await YourModel.findOne({ _id: '目标文档ID' }); } catch (err) { // 仅忽略DocumentNotFoundError,其余错误继续抛出 if (err.name !== 'DocumentNotFoundError') { throw err; } // 找不到时设置为null或自定义默认值 targetDoc = null; }
内容的提问来源于stack exchange,提问作者S. Hesam
相关产品推荐
相关产品推荐

