You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:42:00