«это.IsModified не является функцией» Мангуст?

#node.js #mongoose

Вопрос:

я хочу обновить пароль при вызове функции put для обновления данных профиля

 exports.updateProfileUser = catchAsyncErrors(async (req, res) => {
  const userId = req.params.id
  const { username, password } = req.body
  let user = await User.findById(userId)

  user = await User.findByIdAndUpdate(
    userId,
    {
      username,
      password,
    },
    {
      new: true,
      runValidators: true,
      useFindAndModify: false,
    }
  )

  res.status(200).json({
    success: true,
    user,
    message: 'User Profile Updated',
  })
})
 

и я делаю предварительное обновление схемы выглядит так

 // Encrypting password before update user
userSchema.pre('findOneAndUpdate', async function (next) {
  if (!this.isModified('password')) {
    next()
  }
  this.password = await bcrypt.hash(this.password, 10)
})
 

но я получил ошибку «this.IsModified не является функцией»,…

Ответ №1:

поскольку вы находитесь в промежуточном программном обеспечении findOneAndUpdate, вам необходимо использовать промежуточное программное обеспечение pre («сохранить» ecc) для этого типа операций:

 schema.pre('save', function(next) {
        if (!this.isModified('password')) {
            return next();
        }

        /* istanbul ignore next */
        const rounds = env === 'test' ? 1 : 9;

        bcryptjs
            .hash(this.password, rounds)
            .then(hash => {
                this.password = hash;
                next();
            })
            .catch(next);
    });