1

我已经创建了这个并一直在使用这个模型。但是现在我已经添加了 @pre<Offer>("save",因为我想在保存之前对数据进行一些检查并相应地调整值。

我的问题是,当我首先进行更新时,控制台日志永远不会得到输出。然后我永远无法设置this.isOfferLive = false;如果我发布isOfferLive:true所以pre永远不会被调用

我想念你什么?

我在用

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

我注意到的一件事是,在查看 consoe 日志时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);
4

1 回答 1

0

更新:找到了一种更新它的方法,但它没有记录,我不推荐它!:

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();
})();
于 2019-07-11T08:28:16.057 回答