簡體   English   中英

Mongoose Pre 和 Post 鈎子:停止執行查詢

[英]Mongoose Pre and Post hook: stopping a query from execution

我正在為應用程序進行版本控制更改。 我正在使用 mongoose pre-hook 在根據版本控制要求進行處理之前更改查詢,我遇到了一種情況,我需要進行單獨的查詢以檢查其他文檔是否存在,如果存在,我不必須執行當前查詢,如下所示,

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;
  }
});

在上面找到預掛鈎,我正在嘗試

  • 使用查找查詢檢查數據庫中是否存在所需的文檔,如果確實存在則返回
  • 如果文檔不存在,我將通過設置基於默認版本的查詢來執行查詢。

這里的問題是this.setQuery都會執行 set 查詢,並且它返回的結果也是我為this.setQuery獲得的this.setQuery ,而不是其他數據庫查詢結果( doc )。

有沒有辦法在 mongoose pre-hook 中停止默認查詢執行?

任何幫助將不勝感激。

停止執行后續操作的唯一方法是拋出錯誤,因此您可以在else拋出特定錯誤,並將數據放在錯誤對象的屬性中,例如:

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

但這意味着用 try/catch 包裝所有 find 調用,並在 catch 中以提取數據的方式處理此特定錯誤,或者拋出主要錯誤,檢查它是否是實際錯誤。 最后,您將擁有非常丑陋的代碼和邏輯。

這是專門針對您詢問的方式,但通常您可以定義另一種方法,例如findWithCheck() ,並在此自定義方法中檢查上面的 pre 鈎子。

當然,您也可以嘗試覆蓋實際的find() ,但這會有點過分,在這種情況下,這意味着更多地為了測試目的而不是開發目的而破壞整個事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM