Express中Error [ERR_HTTP_HEADERS_SENT]错误排查求助
问题分析与解决
你的判断有误,问题不在catch块,而是try块里的短路逻辑没有终止后续代码执行,导致同一请求被多次响应。
错误原因
当数据库未找到用户时,!user && res.status(400).json("Wrong credentials!")会发送一个400响应,但代码不会停止执行,会继续往下走:
- 执行
const validated = await bcrypt.compare(req.body.password, user.password)时,user是undefined,访问user.password会抛出错误 - 错误进入
catch块,又发送一次500响应 - 同一请求先后收到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
相关产品推荐
相关产品推荐

