仅调用 Typegoose 进行保存操作时,钩子在 updateOne 上不起作用
Posted
技术标签:
【中文标题】仅调用 Typegoose 进行保存操作时,钩子在 updateOne 上不起作用【英文标题】:Hooks are not working on updateOne when using Typegoose only for save operations are called 【发布时间】: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);
【问题讨论】:
【参考方案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();
)();
【讨论】:
以上是关于仅调用 Typegoose 进行保存操作时,钩子在 updateOne 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章
当我使用Model.findOneAndUpdate时,不会调用用于保存和更新的猫鼬预钩子
Typescript typegoose getModelForClass 返回类型