Mon goose pre-ловушки для сохранения и обновления не вызываются, когда я использовал Model.findOneAndUpdate - PullRequest
2 голосов
/ 30 января 2020

Я создал приложение express с mon goose. Я также создал хук сохранения и обновления следующим образом:

userSchema.pre("update", async function save(next) {
    console.log("inside update")
     });

userSchema.pre("update", async function save(next) {
    console.log("inside save")
     });

, но каждый раз, когда я вызываю Model.findOneAndUpdate(), предварительные хуки не вызываются, разве прехук save и update не работает для findOneAndUpdate?

1 Ответ

2 голосов
/ 30 января 2020

Как указано в пн goose документы Перехваты pre и post save () не выполняются при update () и findOneAndUpdate ().

Вам необходимо использовать findOneAndUpdate hook за это. Но вы не можете получить доступ к документу, который будет обновляться с использованием этого ключевого слова. Если вам нужен доступ к документу, который будет обновлен, вам нужно выполнить явный запрос для документа.

userSchema.pre("findOneAndUpdate", async function() {
  console.log("I am working");
  const docToUpdate = await this.model.findOne(this.getQuery());
  console.log(docToUpdate); // The document that `findOneAndUpdate()` will modify
});

Или, если вы можете установить значение поля, используя this.set(), например:

userSchema.pre("findOneAndUpdate", async function() {
  console.log("I am working");
  this.set({ updatedAt: new Date() });
});

Допустим, у нас есть эта схема пользователя:

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  name: String,
  updatedAt: {
    type: Date,
    default: Date.now()
  }
});

userSchema.pre("findOneAndUpdate", async function() {
  console.log("I am working");
  this.set({ updatedAt: new Date() });
});

module.exports = mongoose.model("User", userSchema);

И этот документ пользователя:

{
    "updatedAt": "2020-01-30T19:48:46.207Z",
    "_id": "5e33332ba7c5ee3b98ec6efb",
    "name": "User 1",
    "__v": 0
}

Когда мы обновляем имя этого пользователя следующим образом:

router.put("/users/:id", async (req, res) => {
  let result = await User.findOneAndUpdate(
    { _id: req.params.id },
    { name: req.body.name },
    { new: true }
  );

  res.send(result);
});

Значение поля updatedAt будет установлено для пользователя и будет обновлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...