You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:25:54