Хуки не работают на updateOne при использовании Typegoose только для операций сохранения - PullRequest
0 голосов
/ 04 июля 2019

Я уже создал это и использовал эту модель. Но теперь я добавил @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

Одна вещь, которую я заметил, заключается в том, что 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 Ответ

0 голосов
/ 11 июля 2019

Обновление: нашел способ обновить его, но он не задокументирован, и я не рекомендую его!:

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