#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);
});