Не удается обновить пароль и ввести Postman

#node.js #rest #express #postman

#node.js #отдых #экспресс #postman

Вопрос:

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

 router.put('/forgotpassword', async (req, res) => {
const { email } = req.body;

const errors = validationResult(req);

if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
}

try {
    let user = await User.findOne({ email });

    if (!user) {
        return res.status(400).json({
            errors: [{ msg: `User with that email doesn't exist` }],
        });
    }

    const token = jwt.sign({ _id: user._id }, resetUserPassword, {
        expiresIn: '1m',
    });

    const emailData = {
        from: emailFrom,
        to: email,
        subject: 'Password Reset Link',
        html: `
        <h1> Please Click the Link to Reset your password </h1>
        <p>${PORT}/auth/resetpassword/${token}</p>`,
    };

    return User.updateOne({ resetUserPassword: token }, (err) => {
        if (err) {
            console.log('RESET PASSWORD LINK ERROR');
            return res.status(400).json({
                err: 'Error in resetting the password',
            });
        } else {
            sgMail
                .send(emailData)
                .then((sent) => {
                    // console.log('SIGNUP EMAIL SENT', sent)
                    return res.json({
                        message: `Email has been sent to ${email}. Follow the instruction to activate your account`,
                    });
                })
                .catch((err) => {
                    // console.log('SIGNUP EMAIL SENT ERROR', err)
                    return res.json({
                        message: err.message,
                    });
                });
        }
    });
} catch (error) {
    console.error(err.message);
    res.status(500).send('Server error');
}});
  

и я успешно получил его по электронной почте.

Пример: http://localhost:5000/api/auth/reset/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1ZjZkOTllZmFkNDRhZDNhMjBkMDYyNDQiLCJpYXQiOjE2MDEwMjM1NTUsImV4cCI6MTYwMTAyMzYxNX0.sZ0YEUwRDbgcw6O90QLSdguki0y6juCbXDiePWCX1hY

Это ссылка, которую я использовал в postman

Однако меня беспокоит то, что я всегда получаю эту ошибку в postman

Postman

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

Вот мой код для сброса пароля

 router.put(
'/reset',
[
    check(
        'newPassword',
        'Please enter a password with 6 or more characters'
    ).isLength({ min: 6 }),
],
async (req, res) => {
    const { resetPassword, newPassword } = req.body;

    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }

    try {
        if (resetPassword) {
            jwt.verify(resetPassword, resetUserPassword, function (err) {
                if ((err, decoded)) {
                    return res.status(400).json({
                        err: 'Expired Link. Please try again',
                    });
                }
            });
}
                User.findOne(
                    {
                        resetPassword,
                    },
                    (err, user) => {
                        if (err || !user) {
                            return res.status(400).json({
                                error: 'Something went wrong. Try later',
                            });
                        }
                    const updatedFields = {
                        password: newPassword,
                        resetPassword: '',
                    };

                    user = _.extend(User, updatedFields);

                    user.save((err, result) => {
                        if (err) {
                            return res.status(400).json({
                                error: 'Error resetting user password',
                            });
                        }
                        res.json({
                            message: `Great! Now you can login with your new password`,
                        });
                    });
                }
            );
    } catch (error) {
        console.error(err.message);
        res.status(500).send('Server error');
    }
});
  

Мой маршрут

Примечание: Маршрут аутентификации работает, потому что я пробую его с помощью get — res.send(‘Auth Route’);

Вот база данных моего пользователя

Схема пользователя

Маршруты

Ответ №1:

URL-адрес запроса для маршрута сброса содержит параметр path, то есть часть после /api/auth/reset . Итак, чтобы express мог перехватить этот запрос, вам необходимо изменить определение маршрута и добавить параметр path:

 router.put(
'/reset/:token',
[
    check(
        'newPassword',
        'Please enter a password with 6 or more characters'
    ).isLength({ min: 6 }),
], ...
  

Комментарии:

1. я получаю эту ошибку { «Сообщение»: «Пожалуйста, введите пароль из 6 или более символов», «param»: «NewPassword», «location»: «body» }

2. Тогда это новая проблема, поскольку вы можете видеть, что маршрут теперь пройден… Вы уверены, что ваш запрос содержит допустимое значение for newPassword в теле запроса?

3. Вам это не понадобится из-за user = _.extend(user, updatedFields);

4. Я не уверен, что понимаю. Вы применяете _.extend совершенно другую часть своего кода, которая не имеет ничего общего с /reset маршрутом. Также эта новая ошибка не имеет ничего общего с исходной ошибкой Cannot PUT ... , которая была показана на скриншоте. Эта проблема решена, поэтому, пожалуйста, примите этот ответ и опубликуйте новый или, по крайней мере, отредактируйте свой вопрос…