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

电商项目登录API遇ERR_HTTP_HEADERS_SENT错误及凭证验证失败问题

问题分析与解决方案

核心问题1:重复响应引发的ERR_HTTP_HEADERS_SENT错误

你的代码在判断用户不存在、密码不匹配时,只发送了响应但没终止函数执行,导致后续代码继续运行并再次发送响应,触发了这个错误。比如:

  • 当!user为真时,发送401响应后,代码还会继续执行到res.status(200).json(user),给客户端重复发送了两次响应。
  • 密码不匹配时的响应逻辑也一样,没有终止函数,后续代码依然会执行。

核心问题2:登录验证逻辑异常(返回"wrong credentials")

当用户不存在时,代码未终止会继续访问user.password,此时user是undefined,直接抛出错误进入catch块,导致验证逻辑异常,最终返回错误的凭证提示。

修复后的代码

//LOGIN
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!");
    }

    // 验证通过,返回用户信息
    res.status(200).json(user);
    console.log(user);
  } catch (err) {
    res.status(500).json(err);
  }
});

module.exports = router;

额外检查项

如果修复后仍登录失败,需确认注册时的密码加密逻辑与解密一致:

  • 注册时必须用相同密钥和算法加密,且要把加密对象转为字符串存入数据库:
    const encryptedPassword = CryptoJS.AES.encrypt(
      req.body.password,
      process.env.PASS_SEC
    ).toString();
    
  • 确保数据库中存储的是加密后的字符串,而非CryptoJS的加密对象(存对象会导致解密失败)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:10:36