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

ExpressJS登录接口二次请求报ERR_HTTP_HEADERS_SENT错误求助

问题原因

这个报错Error [ERR_HTTP_HEADERS_SENT]的本质是同一请求周期内你向客户端发送了多次响应,Express不允许在响应已经返回给客户端后再次修改响应头或发送新的响应内容。

你的代码问题出在两处条件判断的逻辑上:

  • 当用户不存在(!user为true)时,你执行了res.status(401).json("Wrong credentials!")返回了响应,但没有终止后续代码执行,程序会继续往下走解密user.password的逻辑,此时user为null,直接抛出异常进入catch块,catch里又执行了res.status(500).json(err)发送第二次响应,就触发了报错。
  • 密码校验不通过的判断同理,返回401后没有终止代码,后续还会执行生成token、返回200响应的逻辑,也会触发多次响应的问题。
修复方案

在两处条件判断的响应语句后加return,终止当前请求的后续逻辑执行即可,建议把短路写法改成标准if判断更易读、避免同类问题:

router.post("/login", async (req, res) => {
  try {
    const user = await User.findOne({ username: req.body.username });
    if (!user) {
      return res.status(401).json("Wrong credentials!");
    }

    const hashedPassword = CryptoJS.AES.decrypt(
      user.password,
      process.env.PASS_SEC
    );
    const OriginalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);

    if (OriginalPassword !== req.body.password) {
      return res.status(401).json("Wrong credentials!");
    }

    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);
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:09:03