网站搜索

mongodb - 当仅在 Typegoose 中使用时,Hooks 在 updateOne 上不起作用,只会在 save 操作上被调用


我已经创建了这个并且一直在使用这个模型。但现在我添加了 @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();
})();