#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
Я знаю, что моя ошибка в ссылке, и я не могу понять, как это работает. Поэтому с этой проблемой я также не могу определить, работает ли обновление пароля или нет. короче говоря, у меня две проблемы.
Вот мой код для сброса пароля
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 ...
, которая была показана на скриншоте. Эта проблема решена, поэтому, пожалуйста, примите этот ответ и опубликуйте новый или, по крайней мере, отредактируйте свой вопрос…