1

我正在为应用程序进行版本控制更改。我正在使用 mongoose 预挂钩根据版本控制要求在处理之前更改查询,我遇到了一种情况,我需要进行单独的查询以检查其他文档是否存在,如果它不存在必须执行当前查询,如下所示,

schema.pre('find', { document: false, query: true }, async function (next) {
  const query = this.getQuery();
  const doc = await model.find(query).exec();
  if (!doc) {
    const liveVersion = { ...query, version: "default" };
    this.setQuery(liveVersion);
  } else {
    return doc;
  }
});

在上面的 find pre-hook 中,我正在尝试

  • 使用查找查询检查数据库中是否存在所需的文档,如果确实存在则返回
  • 如果文档不存在,我将通过设置基于默认版本的查询来执行查询。

这里的问题是 mongoose 无论如何都会执行 set 查询,它返回的结果也是我得到的this.setQuery结果,而不是其他 DB 查询结果(doc)。

有没有办法停止猫鼬预钩子中的默认查询执行?

任何帮助将不胜感激。

4

1 回答 1

0

停止执行后续操作的唯一方法是抛出一个错误,因此您可以else在错误对象的属性中使用您的数据抛出一个特定的错误,例如:

else {
  let err = new Error();
  err.message = "not_an_error";
  err.data = doc;
}

但这意味着用 try/catch 包装所有 find 调用,并在 catch 中以提取数据的方式处理此特定错误,或者抛出主要错误检查是否是实际错误。最后你会得到一个非常丑陋的代码和逻辑。

这是专门针对您提出要求的方式,但通常您可以定义另一个方法,例如findWithCheck(),并在此自定义方法中检查上面的 pre 钩子。

当然,您也可以尝试覆盖实际的find(),但这将是矫枉过正,在这种情况下,这意味着更多地出于测试目的而不是开发目的而破坏整个事物。

于 2020-12-03T15:47:08.447 回答