基本上,当我尝试登录用户时,如果输入了错误的密码或用户名,然后尝试使用正确的凭据登录,就会出现此错误。
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:371:5)
at ServerResponse.setHeader (node:_http_outgoing:576:11)
at ServerResponse.header (D:\ecom website\ecom backend\node_modules\express\lib\response.js:794:10)
at ServerResponse.send (D:\ecom website\ecom backend\node_modules\express\lib\response.js:174:12)
at ServerResponse.json (D:\ecom website\ecom backend\node_modules\express\lib\response.js:278:15)
at D:\ecom website\ecom backend\routes\auth.js:57:21
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...
这是我在auth.js中的代码
//LOGIN
router.post('/login', async (req, res) => {
try {
const user = await User.findOne({
username: req.body.username,
});
!user && res.status(401).json('Wrong User Name');
const hashedPassword = CryptoJS.AES.decrypt(
user.password,
process.env.PASS_SEC
);
const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);
const inputPassword = req.body.password;
originalPassword != inputPassword && res.status(401).json('Wrong Password');
const accessToken = jwt.sign(
{
id: user._id,
isAdmin: user.isAdmin,
},
process.env.JWT_SEC,
{ expiresIn: '3d' }
);
const { password, ...others } = user._doc;
res.status(200).json({ ...others, accessToken });
} catch (err) {
res.status(500).json(err);
}
});
我该怎么办?我的代码有问题吗?
2条答案
按热度按时间nbysray51#
!user && res.status(401).json('Wrong User Name');
作为一个语句是一个很糟糕的风格。正如你所看到的,它会导致错误,因为你的代码在发送了头之后并没有跳出这个处理程序。它只是继续下一个语句,最终到达另一个
res.status(...)
。这将试图再次设置一些头,这是不允许的。这就是错误消息告诉你的。用途
这将从处理程序返回,并且不执行函数中的其余代码...当然,对于使用此模式的所有其他示例也是如此。
tktrz96b2#
我看到你在代码中多次使用
res.status(code).json(content)
命令,但是在发送响应后你从来没有退出函数。因此,在一个这样的命令之后-代码将继续在函数中运行,并试图发送另一个响应,这就是你得到错误的地方:服务器正尝试为一个请求发送多个响应。