MERN项目Express处理POST路由出现ERR_HTTP_HEADERS_SENT错误如何解决
问题根因
你遇到的Error [ERR_HTTP_HEADERS_SENT]错误确实是单次请求中多次发送响应导致的,问题出在你的登录路由逻辑里,&&简写的判断逻辑执行完res.send/res.json后,没有终止当前函数的执行,后续的响应代码会继续运行:
- 当用户不存在时,执行完
res.status(404).send("user not found")后,代码还会继续往下执行密码校验、以及最后的res.status(200).json(user),相当于单次请求返回了两次响应 - 当密码错误时,执行完
res.status(400).json('incorrect password')后,代码同样会继续执行最后的200响应,触发报错
修复方案
你之前加return无效的原因是&&简写语法不支持直接跟return语句,换成显式的if判断 + return终止函数执行即可,同时补全catch块的响应逻辑,避免异常场景下客户端无响应:
router.post('/login', async (req, res) => { try { const user = await userModel.findOne({email:req.body.email}); // 条件满足时return终止后续代码执行 if (!user) { return res.status(404).send("user not found"); } const correctPassword = await bcrypt.compare(req.body.password, user.password); // 条件满足时return终止后续代码执行 if (!correctPassword) { return res.status(400).json('incorrect password') } return res.status(200).json(user); } catch (err) { console.log(err) // 异常场景也要返回响应 return res.status(500).json({msg: '服务端错误', err: err}) } })
补充说明
教程代码能正常运行的大概率原因是教程示例里的判断逻辑隐含了return(比如部分简写写法的语法糖差异、或者你漏看了示例中的return关键字),Node/Express的标准规则下,你的原有逻辑必然会触发头重复发送的报错。
内容的提问来源于stack exchange,提问作者notADevYet
相关产品推荐
相关产品推荐

