функция password-local-mongoose changePassword

Я хочу, чтобы пользователь мог изменить свой пароль. Я реализовал маршрут ('/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, хотя я добавил ее, но все равно получаю то же самое ошибка) Какую ошибку я здесь делаю?


person Kasra GH    schedule 04.09.2017    source источник
comment
Можете ли вы показать нам свою схему и промежуточное программное обеспечение на вашей схеме, если они у вас есть?   -  person turmuka    schedule 05.09.2017
comment
Перейдите по этой ссылке sahatyalkabov.com/how-to-implement-password- reset-in-nodejs вам будет полезно...   -  person Syed Ayesha Bebe    schedule 05.09.2017
comment
@turmuka: я уже предоставил изображение своей схемы в своем посте.   -  person Kasra GH    schedule 05.09.2017
comment
@Syed Ayesha Bebe Я уже видел этот пост, мне не нужно ничего реализовывать, поскольку все функции предоставляются самим паспортом. я просто не знаю как им пользоваться   -  person Kasra GH    schedule 05.09.2017
comment
пожалуйста, не помещайте код в виде изображений. скопируйте код и вставьте сюда   -  person phuclv    schedule 07.01.2018


Ответы (3)


У кого-то была такая же проблема прошлой ночью. Их проблема заключалась в том, что пакет нужно было обновить. Я бы проверил, что вы используете последнюю версию.

person James Quick    schedule 21.10.2017

Вот что я сделал в своем контроллере, обрабатывая пароль сброса,

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 вам сначала нужно получить конкретный user для обновления пароля, здесь, в моем случае, текущий пользователь входа в систему, который доступен в req.user, которому мы подвергаемся, вы можете использовать любое возвращаемое свойство для запроса вашей коллекции, используя async await я создал переменную для хранения возвращаемого объекта, в моем случае «пользователь», после чего я привязал setProperty к нему, передав новый пароль (req.body.password), поскольку он возвращает обещание, которое я жду, и назначаю переменную к этому. отсюда вы хороши ... Примечание: поскольку это обещание, оно либо разрешено, либо отклонено, ошибка обработки может быть выполнена путем постукивания вашего кода в безопасное одеяло, try..catch . Вы можете прочитать больше здесь

person IamJMBassey    schedule 27.09.2018

Поскольку changePassword — это метод схемы, его необходимо использовать для экземпляра модели, а не для самой модели или импортированного паспортаLocalMongoose.

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.

person Arootin Aghazaryan    schedule 01.05.2019
comment
Если req.user определен, вы можете напрямую использовать req.user.changePassword() для изменения пароля. Нет необходимости использовать UserModel.findById(). Passport-local-mongoose определяет req.user, когда пользователь входит в систему. - person Mike F; 27.11.2020