Mongoose Pre和Post钩子:停止执行查询



我正在为应用程序进行版本控制更改。我正在使用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查询检查数据库中是否存在所需的文档,并返回if确实存在和
  • 如果文档不存在,我将通过设置默认的基于版本的查询来执行查询

这里的问题是mongoose无论如何都会执行集合查询,它返回的结果也是我为this.setQuery得到的结果,而不是另一个DB查询结果(doc(。

有没有一种方法可以停止mongose预挂接中的默认查询执行?

任何帮助都将不胜感激。

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

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

但这意味着用try/catch包装所有的find调用,并在catch中以提取数据的方式处理这个特定错误,或者如果它是实际错误,则抛出进行主错误检查。最终,您将拥有一个非常丑陋的代码和逻辑。

这是专门针对您询问它的方式的,但通常您可以定义另一个方法,如findWithCheck(),并在这个自定义方法中检查上面的预挂接。

当然,您也可以尝试覆盖实际的find(),但这太过分了,在这种情况下,这意味着更多地出于测试目的而非开发目的来破坏整个东西。

最新更新