Как я могу использовать или создать промежуточное ПО для обновления с использованием схемы mongoose? - PullRequest
0 голосов
/ 30 апреля 2018

С mongoose мы можем использовать некоторые промежуточные программы для манипулирования данными. Например, это известное использование промежуточного программного обеспечения save :

Schema.pre('save', function(next){
  const user = this;
  if (!user.isModified('password')) {
    return next();
  }
  bcrypt.genSalt(10, (err, salt) => {
    if (err) {
        next(err);
    }
    bcrypt.hash(user.password, salt, null, (err, hash) => {
        if (err) {
            next(err);
        }
        user.password = hash;
        next();
    });
  });
});

Я хотел бы знать, как сделать то же самое, когда вы пытаетесь обновить некоторые записи. Я читал на нескольких форумах, которые можно использовать: Schema.pre('update'), я пробовал, но у меня это не работает. Идея состоит в том, чтобы повторно зашифровать новый пароль, когда пользователь хочет изменить его. Я знаю, что мог бы сделать это в контроллере, но я бы хотел снять эту ответственность и сделать это из схемы.

Результат должен быть примерно таким:

Schema.pre('onUpdate', function(next){
  const user = this;
  if (!user.isModified('password')) {
    return next();
  }
  bcrypt.genSalt(10, (err, salt) => {
    if (err) {
        next(err);
    }
    bcrypt.hash(user.password, salt, null, (err, hash) => {
        if (err) {
            next(err);
        }
        user.password = hash;
        next();
    });
  });
});

1 Ответ

0 голосов
/ 30 апреля 2018

Я знаю, что на самом деле это не отвечает на вопрос, но если ваш вариант использования заключается в обновлении только пароля, вы можете использовать следующее:

let userDetails = await User.findOne({ userID: userIDFromRequest });
userDetails.password = request.newPasswordFromRequest;
await userDetails.save();

Не нужно беспокоиться о хешировании.
Кроме того, если вам действительно нужен хук обновления, попробуйте код ниже (не проверено):

UserSchema.pre('update', function(next) {
    let update = this._update;
    if (update.$set && update.$set.password) {
        this.update({}, { password: generateHash(update.$set.password) });
    }
    next();
});

Вы можете прочитать больше здесь: http://mongoosejs.com/docs/middleware.html#notes

...