【问题标题】:Mongoose Pre and Post hook: stopping a query from executionMongoose Pre 和 Post 钩子:停止执行查询
【发布时间】:2021-03-03 03:43:05
【问题描述】:

我正在为应用程序进行版本更改。我正在使用 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;
  }
});

在上面找到pre-hook,我正在尝试

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

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

有没有办法在 mongoose pre-hook 中停止默认查询执行?

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongoose-plugins


    【解决方案1】:

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

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

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

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

    当然,您也可以尝试覆盖实际的 find(),但这有点过头了,在这种情况下,这意味着为了测试目的而不是开发目的而破坏整个事物。

    【讨论】:

    • 我给了你一笔赏金,尽管我没有得到我想要的,至少你试过了。
    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2021-05-03
    • 2018-05-15
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多