【问题标题】:Hooks are not working on updateOne when using Typegoose only for save operations are called仅调用 Typegoose 进行保存操作时,钩子在 updateOne 上不起作用
【发布时间】:2019-11-15 01:58:50
【问题描述】:

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

我注意到的一件事是,在查看 consoe 日志时,Model.create 上会调用 hooks 而不是 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);

【问题讨论】:

    标签: mongodb typescript mongoose typegoose


    【解决方案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();
    })();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多