Итак, я сделал функцию сброса пароля, и она выглядит так:
router.get('/reset/:id',function(req,res,next){
User.findOne({'resetToken': req.params.id.trim()})
.exec(function(error, user){
if (error) return next(error);
else if (!user){
var err = new Error('Invalid Reset Link! The system is unable to find a user with the given reset code.');
err.status = 401;
return next(err);
}else return res.render('resetpass',{token: req.params.id});
})
})
router.post('/reset/:id', function(req,res,next){
if (req.body.newPassword === req.body.confirmNewPassword)
User.findOne({'resetToken': req.params.id.trim()},function(error,user){
if (error) return next(error);
bcrypt.hash(req.body.password, 5, function(err, hash) {
if (err) {
return next(err);
}
user.password = hash;
user.resetToken ='';
user.save();
})
});
return res.redirect('/login');
})
поэтому, когда я заполняю поля сброса пароля и нажимаю "Отправить", я получаю это в консоли: Невозможно установить заголовки после их отправки клиенту
и если я использую это:
router.post('/reset/:id', function(req,res,next){
if (req.body.newPassword === req.body.confirmNewPassword)
var cp;
User.findOne({'resetToken': req.params.id.trim()},function(error,user){
if (error) return next(error);
bcrypt.hash(req.body.password, 5, function(err, hash) {
if (err) {
return next(err);
}
cp = hash;
})
user.password = cp;
user.resetToken ='';
user.save();
});
return res.redirect('/login');
})
мой user.password пуст, и я получаю следующее: Невозможно установить для свойства «пароль» значение null ->, потому что я установил это в UserSchema. Так почему это так? Я пробовал использовать console.infos в другой функции только с переменными, и это примерно так:
bcrypt.hash(.... {console.info('a') })
console.info('b');
моя консоль выглядит так:
b
a
Итак, после bcrypt console.info. Что я могу сделать ?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Обратите внимание, что User.findOne() - это асинхронная операция.
Перенаправление res.redirect('/login') должно называться после, новый пароль сохранен.
Вы можете попробовать этот код ниже:
router.post('/reset/:id', function (req, res, next) {
if (req.body.newPassword === req.body.confirmNewPassword) {
User.findOne({
'resetToken': req.params.id.trim()
}, function (error, user) {
if (error) return next(error);
bcrypt.hash(req.body.password, 5, function (err, hash) {
if (err) {
return next(err);
}
user.password = hash;
user.resetToken = '';
user.save();
// Do the redirection here
res.redirect('/login');
})
});
}
// Do nothing here
})
nvm я решил это.