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

Express中Error [ERR_HTTP_HEADERS_SENT]错误排查求助

问题分析与解决

你的判断有误,问题不在catch块,而是try块里的短路逻辑没有终止后续代码执行,导致同一请求被多次响应。

错误原因

当数据库未找到用户时,!user && res.status(400).json("Wrong credentials!")会发送一个400响应,但代码不会停止执行,会继续往下走:

  1. 执行const validated = await bcrypt.compare(req.body.password, user.password)时,user是undefined,访问user.password会抛出错误
  2. 错误进入catch块,又发送一次500响应
  3. 同一请求先后收到400和500两次响应,触发ERR_HTTP_HEADERS_SENT错误

至于教程代码看似正常,大概率是测试场景没覆盖到「用户不存在」的情况,实际上教程代码也存在同样的隐患,只是没触发错误而已。

修复方案

在发送错误响应后,必须用return终止函数执行,避免后续代码继续运行:

//LOGIN
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 validated = await bcrypt.compare(req.body.password, user.password);
    if (!validated) {
      return res.status(400).json("Wrong credentiaaaals!");
    }

    const { password, ...others } = user._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json(err);
  }
});

module.exports = router;

或者保留短路逻辑,但要加上return:

!user && return res.status(400).json("Wrong credentials!");
!validated && return res.status(400).json("Wrong credentiaaaals!");

这样每次发送响应后都会终止函数,不会出现后续代码报错并重复响应的情况。

内容的提问来源于stack exchange,提问作者Vaodi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:24:17