我有以下密码重置表单路由,表单有密码和密码确认字段。
viewBox.baseVal
当我填写表格时,我收到以下错误
router.post('/users/reset/:token', (req, res, next) => {
if(req.body.password === req.body['password-confirm']) {
req.flash('error', 'Passwords do not match!');
res.redirect('/users/forgot');
}
User.findOne({
resetPasswordToken: req.params.token,
resetPasswordExpires: { $gt: Date.now() }
}, function(err, user) {
if(!user) {
req.flash('error', ' Password reset is invalid or has expired');
res.redirect(302, '/login');
}
const setPassword = promisify(user.setPassword, user);
setPassword(req.body.password);
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
const updatedUser = user.save();
user.save((saveError, updatedUser) => {
// Check if saveError is present here and handle appropriately
req.login(updatedUser, loginError => {
req.flash('success_msg', 'Your password has been reset successfully! You are now logged in!');
res.redirect('/dashboard' + req.user);
})
});
});
});
我还是节点的新手,所以任何重构提示或对此的修复都会非常感激,在这个问题上坚持了几天,不确定我做错了什么。
谢谢。
答案 0 :(得分:2)
首先,当节点发送API调用的响应超过一次时会发生此错误。其次,最佳做法是在发送响应时使用return,例如return res.json(<OBJECT>);
在您的代码中,您正在检查密码
req.body.password === req.body['password-confirm']
应该是这样的
req.body.password !== req.body['password-confirm']
这可能是导致节点发送多个响应的情况
答案 1 :(得分:1)
您多次向客户发送回复,这就是导致Cannot set headers after they are sent to the client
错误的原因。
在你的情况下,你应该有return
(退出)函数执行。例如。当密码不匹配时,您尝试将用户重定向到/users/forgot
,但您没有在此处返回该功能。因此,if
条件下面的代码会执行并尝试再次发送响应。
<强>解决方案强>:
router.post('/users/reset/:token', (req, res, next) => {
if // some condition {
// some code
return res.redirect('/users/forgot');
}
User.findOne({
// some code
}, function(err, user) {
if(!user) {
// some code
return res.redirect(302, '/login');
}
// some code
user.save((saveError, updatedUser) => {
req.login(updatedUser, loginError => {
// some code
return res.redirect('/dashboard' + req.user);
})
});
});
});