javascript - 使用 bcrypt 重置密码功能不起作用,发送到客户端后无法设置标头?
问题描述
所以我做了一个重置密码功能,它看起来像这样:
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.logs,只是使用变量,就像这样:
bcrypt.hash(.... {console.log('a') })
console.log('b');
我的控制台看起来像这样:
b
a
所以 bcrypt console.log 是之后。我能做些什么 ?
解决方案
请注意,这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
})
推荐阅读
- javascript - 字节范围请求在 iOS Safari 上不起作用
- javascript - 如何从 json api 的 JavaScript 中的数组中获取嵌套元素
- apache-kafka - 当有多个生产者时,如何在 kafka 中一次性交付
- azure-devops - 有人可以帮我解决这个错误。我无法从 Azure Devops 克隆到本地
- emacs - 如何调用编辑器到特定的行和相对于行的字符位置?
- swift - 训练对象检测模型时出现“意外错误” - CreateML
- c# - 如何在 C# 中使用蓝牙 MAC 地址与其他设备配对
- python - 修补不需要的列属性
- nginx - 使用 Nginx 和旋转代理服务构建代理站点
- vue.js - 如何在 BootstrapVue 中使用分页