仅调用 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 返回类型

我可以在 Typegoose 中使用私有属性吗?

如何在使用 Typegoose 获取数据时使用 class-transformer 序列化嵌套 js 响应?

liteos错误处理

Mongoose / typegoose 根据开始和结束索引获取数组