如何解决Node.js+Express登录接口ERR_HTTP_HEADERS_SENT报错
报错原因
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 报错的核心逻辑是同一次HTTP请求中你尝试多次发送响应:
你当前的简写判断逻辑只会执行发送响应的代码,不会终止接口函数的后续执行:
- 用户名错误场景下,发送完400响应后,代码会继续执行
bcrypt.compare逻辑,此时user为undefined,访问user.password会触发异常,走到catch逻辑中再次发送500响应,重复发响应就触发了报错 - 密码错误场景下,发送完400响应后,代码会继续走到最后的200响应逻辑,再次发送响应触发报错
修复方法
在每个发送错误响应的逻辑后添加return终止函数后续执行即可,推荐用可读性更高的if判断写法,修复后代码如下:
router.post("/login", async (req, res) =>{ try { const user = await User.findOne({username: req.body.username}) if (!user) { return res.status(400).json("Wrong credentials"); } const passValidate = await bcrypt.compare(req.body.password, user.password) if (!passValidate) { return res.status(400).json("Wrong credentials"); } const {password, ...others} = user._doc; res.status(200).json(others) } catch(err) { res.status(500).json(err); } });
如果偏好原先的简写语法,也可以直接在判断后加return:
!user && res.status(400).json("Wrong credentials") && return; !passValidate && res.status(400).json("Wrong credentials") && return;
内容的提问来源于stack exchange,提问作者Kingsley
相关产品推荐
相关产品推荐

