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