網站搜尋

mongodb - 當僅在使用 Typegoose 時,hooks 僅對 save 操作有效,updateOne 上的 hooks 無法工作


我已經創建了這個並一直在使用這個模型。但現在我新增了 @pre<Offer>("save",因為我想在保存之前對數據進行一些檢查,並相應地調整數值。

我的問題是,當我先執行更新時,控制台日誌從未輸出。然後,如果我發布 isOfferLive:true,我就無法設定 this.isOfferLive=false;,所以 pre 從未被調用

我在想你嗎?

我正在使用

    "reflect-metadata": "^0.1.13",
    "typegoose": "^5.7.2",
    "mongoose": "^5.6.3",
emitDecoratorMetadata and experimentalDecorators are be enabled in tsconfig.json

我注意到的一件事是,當查看控制台日誌時,hooks 會在 Model.create 上被調用,但在 Model.updateOne 上則不會。

我該如何讓它們在更新時也能運作

我的班級

@pre<Offer>("save", function(next: HookNextFunction) {
  console.log("[**** save]: " + this.isOfferLive);
  this.isOfferLive = false;
  if (!isOfferValid(this)) {
    this.isOfferLive = false;
  }
  next();
})
export class Offer extends Typegoose {
  @prop({ required: true, default: false })
  public isOfferLive: boolean;
}

export const Model = new Offer().getModelForClass(Offer);

答案#1

更新:找到了一種更新的方法,但它沒有文件記錄,我不建議這麼做!

import * as mongoose from "mongoose";
import { pre, prop, Typegoose } from "./typegoose/src/typegoose";

@pre<Offer>("updateOne", function(this: mongoose.Query<any>) {
    // @ts-ignore
    this._update.isOfferLive = true;
    return;
})
class Offer extends Typegoose {
    @prop({ required: true, default: false })
    public isOfferLive: boolean;
}
const OfferModel = new Offer().getModelForClass(Offer);

(async () => {
    mongoose.set("debug", true);
    await mongoose.connect(`mongodb://mongodb:27017/`, {
        useNewUrlParser: true,
        useFindAndModify: true,
        useCreateIndex: true,
        dbName: "verify315",
        user: "user",
        pass: "passwd",
        authSource: "admin",
        autoIndex: true
    });

    const dummy = new OfferModel();
    await dummy.save();

    await dummy.updateOne(dummy).exec();

    const dummyback = await OfferModel.findById(dummy._id).exec(); // re-fetch because otherwise it does not load the changes
    console.log("after updateOne:", dummyback);

    await mongoose.disconnect();
})();