#javascript #node.js #mongodb #mongoose #bcrypt
#javascript #node.js #mongodb #mongoose #bcrypt
Вопрос:
Я пытаюсь добавить опцию смены пароля на панель инструментов, которую я создал. В моей форме есть три входа: currentPassword, NewPassword, confirmNewPassword. Это ваша стандартная проверка текущего пароля по базе данных, если он совпадает, затем обновите его новым паролем.
Независимо от того, что я делаю, я не могу заставить код запускаться при успешном совпадении (код после bcrypt.compare). Я знаю, что использую правильный пароль. Я не могу понять, что я делаю не так. Ценю помощь.
router.post("/changepassword", ensureAuthenticated, (req, res) => {
const { currentPassword, newPassword, confirmNewPassword } = req.body;
const userID = req.user.userID;
let errors = [];
//Check required fields
if (!currentPassword || !newPassword || !confirmNewPassword) {
errors.push({ msg: "Please fill in all fields." });
}
//Check passwords match
if (newPassword !== confirmNewPassword) {
errors.push({ msg: "New passwords do not match." });
}
//Check password length
if (newPassword.length < 6 || confirmNewPassword.length < 6) {
errors.push({ msg: "Password should be at least six characters." });
}
if (errors.length > 0) {
res.render("changepassword", {
errors,
name: req.user.name,
});
} else {
//VALIDATION PASSED
//Ensure current password submitted matches
User.findOne({ userID: userID }).then(user => {
//encrypt newly submitted password
bcrypt.compare(currentPassword, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
console.log(user.password);
//Update password for user with new password
bcrypt.genSalt(10, (err, salt) =>
bcrypt.hash(newPassword, salt, (err, hash) => {
if (err) throw err;
user.password = hash;
user.save();
})
);
req.flash("success_msg", "Password successfully updated!");
res.redirect("/dashboard");
} else {
//Password does not match
errors.push({ msg: "Current password is not a match." });
res.render("changepassword", {
errors,
name: req.user.name,
});
}
});
});
}
});
Комментарии:
1. Вы должны перенаправить внутри
bcrypt.hash
обратного вызова
Ответ №1:
Я понял, что это было. const userId должен был быть установлен равным req.user.id . Затем в моем Mongoose find я должен был использовать _id в качестве запроса.
router.post("/changepassword", ensureAuthenticated, (req, res) => {
const { currentPassword, newPassword, confirmNewPassword } = req.body;
const userID = req.user.id;
let errors = [];
//Check required fields
if (!currentPassword || !newPassword || !confirmNewPassword) {
errors.push({ msg: "Please fill in all fields." });
}
//Check passwords match
if (newPassword !== confirmNewPassword) {
errors.push({ msg: "New passwords do not match." });
}
//Check password length
if (newPassword.length < 6 || confirmNewPassword.length < 6) {
errors.push({ msg: "Password should be at least six characters." });
}
if (errors.length > 0) {
res.render("changepassword", {
errors,
name: req.user.name,
});
} else {
//VALIDATION PASSED
//Ensure current password submitted matches
User.findOne({ _id: userID }).then(user => {
//encrypt newly submitted password
bcrypt.compare(currentPassword, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
//Update password for user with new password
bcrypt.genSalt(10, (err, salt) =>
bcrypt.hash(newPassword, salt, (err, hash) => {
if (err) throw err;
user.password = hash;
user.save();
})
);
req.flash("success_msg", "Password successfully updated!");
res.redirect("/dashboard");
} else {
//Password does not match
errors.push({ msg: "Current password is not a match." });
res.render("changepassword", {
errors,
name: req.user.name,
});
}
});
});
}
});
Ответ №2:
Попробуйте использовать синтаксис асинхронного ожидания
router.post("/changepassword", ensureAuthenticated, async (req, res) => {
const { currentPassword, newPassword, confirmNewPassword } = req.body;
const userID = req.user.userID;
let errors = [];
//Check required fields
if (!currentPassword || !newPassword || !confirmNewPassword) {
errors.push({ msg: "Please fill in all fields." });
}
//Check passwords match
if (newPassword !== confirmNewPassword) {
errors.push({ msg: "New passwords do not match." });
}
//Check password length
if (newPassword.length < 6 || confirmNewPassword.length < 6) {
errors.push({ msg: "Password should be at least six characters." });
}
if (errors.length > 0) {
res.render("changepassword", {
errors,
name: req.user.name,
});
} else {
//VALIDATION PASSED
//Ensure current password submitted matches
User.findOne({ userID: userID }).then(async (user) => {
//encrypt newly submitted password
// async-await syntax
const isMatch = await bcrypt.compare(currentPassword, user.password);
if (isMatch) {
console.log(user.password);
//Update password for user with new password
bcrypt.genSalt(10, (err, salt) =>
bcrypt.hash(newPassword, salt, (err, hash) => {
if (err) throw err;
user.password = hash;
user.save();
})
);
req.flash("success_msg", "Password successfully updated!");
res.redirect("/dashboard");
} else {
//Password does not match
errors.push({ msg: "Current password is not a match." });
res.render("changepassword", {
errors,
name: req.user.name,
});
}
});
}
});
Комментарии:
1. Спасибо, но результаты те же. Независимо от того, что я пытаюсь, он всегда отвечает «Пароль не совпадает».