Функция changePassword passport-local-mongoose
Я хочу иметь функциональность, что пользователь может изменить свой пароль. Я реализовал маршрут ('/ resetPasswd') следующим образом:
UserRouter.route('/resetPasswd')
.post(function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
user.changePassword(req.body.oldPassword, req.body.newPassword, function (err, user) {
if (err) next(err);
res.json('password changes successfully !');
})
})(req, res, next);
});
вот что я отправляю как тело:
{
"oldpassword": "secret",
"newPassword": "new"
}
Но я получаю эту ошибку как ответ:
{
"message": "user.changePassword is not a function",
"error": {}
}
и это изображение моей схемы:
схема пользователя:
Я не думаю, что мне следует объявлять функцию changePassword в моей схеме (так как она предоставляется passport-local-mongoose, хотя я добавил ее, но все еще получаю ту же ошибку) Какую ошибку я здесь делаю?
2 ответа
У кого-то была такая же проблема прошлой ночью. Их проблема заключалась в том, что пакет нужно было обновить. Я бы проверил, что вы на последней версии.
Поскольку changePassword
является методом схемы, он должен использоваться на экземпляре модели, а не на самой модели или импортированном passportLocalMongoose.
UserModel.findById(req.user._id)
// I assume you already have authentication and the req.user is generated
.then(foundUser => {
foundUser.changePassword(req.body.old, req.body.new)
.then(() => {
console.log('password changed');
})
.catch((error) => {
console.log(error);
})
})
.catch((error) => {
console.log(error);
});
Паспорт объекта пользователя, отправляемый в функцию обратного вызова, является просто объектом, а не объектом документа экземпляра схемы, поэтому он не имеет функции changePassword.
Вот что я сделал в моем контроллере для обработки пароля сброса,
exports.editPassword = async (req, res) => {
const user = await User.findOne({
username: req.user.username
});
await user.setPassword(req.body.password);
const updatedUser = await user.save();
req.login(updatedUser);
req.flash('success', 'Password Changed Successfully') res.redirect('back')
}
из документации Passport-local-mongoose сначала необходимо получить конкретный пользователя для обновления пароля, здесь, в моем случае, текущий пользователь для входа в систему, который доступен в req.user, с которым мы сталкиваемся, вы можете использовать любой из свойство return для запроса вашей коллекции, используя async await, я создал переменную для хранения возвращаемого объекта, в моем случае "user", после чего я приковал к нему setProperty, передав новый пароль (req.body.password), так как он возвращает обещание я жду этого и назначу переменную к нему. отсюда вы хороши... Примечание: поскольку это обещание, которое либо разрешается отклонить, обработку ошибки можно выполнить, скопировав код в безопасное одеяло, try..catch
, Вы можете прочитать больше здесь