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

用户登录遇Unhandled Promise Error及ERR_HTTP_HEADERS_SENT错误求助

问题原因分析

这个ERR_HTTP_HEADERS_SENT错误的核心是你尝试多次向客户端发送HTTP响应,同时还存在未处理的Promise拒绝问题:

  1. 当用户不存在(!user为真)时,你发送了400响应,但没有终止函数执行,代码会继续运行到bcrypt.compare行,此时user是undefined,访问user.password会抛出异常,后续catch块再发送500响应时,就会触发“头已发送”的错误。
  2. 即使没有抛出异常,后续的res.status(200).json(others)也会再次发送响应,导致重复设置HTTP头。
修复后的代码
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 credentials!");
        }

        const { password, ...others } = user._doc;
        res.status(200).json(others);
    } catch (err) {
        res.status(500).json(err);
    }
});
关键修改点
  • 将原有的!user && res.status(...)改为if (!user) { return res.status(...); }:发送响应后通过return终止函数执行,避免后续代码继续运行。
  • 密码验证不通过时同样用return终止函数,确保不会执行到后续的成功响应代码。
  • 该修改同时解决了重复发送响应的问题,以及user为undefined时访问属性导致的未处理Promise拒绝。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:57:17