Как сделать mon.f goose's model.findByIdAndUpdate () триггером model.save ()? - PullRequest
0 голосов
/ 14 февраля 2020

В моей базе данных есть модель mon goose для пользователей. У меня есть контроллер обновлений, который вызывает метод findByIdAndUpdate в моей модели. Теперь, когда я храню пароли в своей базе данных, я сначала хотел бы иметь их sh, поэтому у меня есть:

userSchema.pre("save", async function(next) {
  // if password is modified then hash it
  next();
});

Теперь, когда мой контроллер обновлений вызывает findByIdAndUpdate, мне кажется, что model.save() не вызывается, поэтому хеширование никогда не происходит.

Есть ли способ перегрузить исходное поведение findByAndUpdate, или как найти правильное решение этой проблемы?

1 Ответ

0 голосов
/ 15 февраля 2020

findByIdAndUpdate запускает промежуточное ПО findOneAndUpdate () . Хуки до и после сохранения () не выполняются в findOneAndUpdate ().

Вы не можете получить доступ к обновляемому документу в промежуточном программном обеспечении pre('findOneAndUpdate'). Если вам нужен доступ к документу, который будет обновлен, вам нужно выполнить явный запрос для документа.

Пример схемы с промежуточным программным обеспечением findOneAndUpdate:

const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");

const schema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    unique: true
  },
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    required: true
  }
});

schema.pre("save", async function(next) {
  if (!this.isModified("password")) return next();
  this.password = await bcrypt.hash(this.password, 12);
  next();
});

schema.pre("findOneAndUpdate", async function() {
  const docToUpdate = await this.model.findOne(this.getQuery());

  // add your hashing logic to here
  let newPassword = await bcrypt.hash(docToUpdate.password, 12);

  this.set({ password: newPassword });
});

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

Пример маршрута для тестирования:

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

  res.send(result);
});

Обратите внимание, что я использовал {} внутри findByIdAndUpdate, потому что наш пароль будет хешироваться в промежуточном программном обеспечении findOneAndUpdate.

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