Mongoose: предварительный хук findOneAndUpdate не работает - PullRequest
0 голосов
/ 24 сентября 2018

Я искал об этой проблеме, и все решения, которые я нашел, фактически не работали.В настоящее время я использую эту функцию для шифрования пароля перед сохранением в базе данных, но даже при изменении значений при ведении журнала this пароль не сохраняется, как если бы он был изменен в функции.

UserSchema.pre('findOneAndUpdate', function(next) {
  const update = this.getUpdate();
  if (!_.isEmpty(update.password)) {
    bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(update.password, salt, (err, hash) => {
        this.getUpdate().password = hash;
        next();
      })
    })
  }
  next();
});

Я также попытался изменить значение this._update.password, но оно тоже не сработало.Я также пытался использовать $set или даже post hook, но ни один из них не помог ни.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018
user.pre('findOneAndUpdate', function(next){
    const user=this.getUpdate().$set;
    if(!user.password){
      next();
    }
    else{
    bcrypt.genSalt(10, function (err, salt) {
        if (err) {
          return next(err);
        }
        bcrypt.hash(user.password, salt, null, function (err, hash) {
          if (err) {
            return next(err);
          }
          user.password = hash;
           next();
        });
    });
  }
})
0 голосов
/ 24 сентября 2018

Я только что проверил это локально с помощью:

var result = Author.findOneAndUpdate({ _id: <some id> }, { password: '111' }).exec()

и этот pre хук:

AuthorSchema.pre('findOneAndUpdate', function(next) {
  this._update.password = 'BBB'
  next();
});

Пароль был сохранен как BBB

Схема автораимеет поле пароля, которое type: String

Я на 3.6.5

В вашем случае bcrypt у вас также есть дополнительный next() без else, которыйпортит вам жизнь ... должно быть:

UserSchema.pre('findOneAndUpdate', function(next) {
  const update = this.getUpdate();
  if (!_.isEmpty(update.password)) {
    bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(update.password, salt, (err, hash) => {
        this.getUpdate().password = hash;
        next();
      })
    })
  } else {
    next();
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...