用户登录遇Unhandled Promise Error及ERR_HTTP_HEADERS_SENT错误求助
问题原因分析
这个ERR_HTTP_HEADERS_SENT错误的核心是你尝试多次向客户端发送HTTP响应,同时还存在未处理的Promise拒绝问题:
- 当用户不存在(
!user为真)时,你发送了400响应,但没有终止函数执行,代码会继续运行到bcrypt.compare行,此时user是undefined,访问user.password会抛出异常,后续catch块再发送500响应时,就会触发“头已发送”的错误。 - 即使没有抛出异常,后续的
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
相关产品推荐
相关产品推荐

