[英]Cannot set headers after they are sent to the client (Node.js)
所以基本上,当我尝试登录用户时输入错误的密码或用户名,然后尝试使用正确的凭据登录时,我会收到此错误。
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);
}
});
我应该怎么办? 我的代码有问题吗?
.user && res.status(401);json('Wrong User Name');
作为声明是恕我直言,相当糟糕的风格。 如您所见,它会导致错误,因为您的代码在发送标头后不会跳出此处理程序。 它只是继续下一个语句并最终到达另一个res.status(...)
。 这将尝试再次设置一些标头,这是不允许的。 这就是错误消息告诉您的内容。
采用
if (!user) {
return res.status(401).json('Wrong User Name');
}
反而。 这将从处理程序返回,并且不会执行 function 中的剩余代码......当然对于您使用此模式的所有其他实例也是如此。
我看到您在代码中多次使用res.status(code).json(content)
命令,但在发送响应后您从未退出 function。 结果,在一个这样的命令之后 - 代码将在 function 中继续并尝试发送另一个响应,这就是您收到错误的地方:服务器正在尝试为一个请求发送多个响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.