Функция 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, Вы можете прочитать больше здесь

Другие вопросы по тегам