Node.js报错:Can't set headers after they are sent to the client 求助
问题原因与解决方法
这个错误的核心是你尝试给客户端发送多次HTTP响应。比如输入错误邮箱时,代码发送了404 user not found的响应,但没终止函数执行,后续代码还会继续跑:
- 试图访问
user.password(此时user是undefined,直接触发报错) - 最后还会执行
res.status(200).json(user),再次发送响应,导致浏览器收到重复响应头,抛出ERR_HTTP_HEADERS_SENT错误。
修复方案:
两种简单方法选一种即可:
方式1:发送响应后加return终止函数
把原代码的短路判断改成清晰的if语句,同时每次发送响应后用return停止后续代码执行:
try { const user = await User.findOne({ email: req.body.email }); if (!user) { return res.status(404).json("user not found"); } const validPassword = await bcrypt.compare(req.body.password, user.password); if (!validPassword) { return res.status(400).json("wrong password"); } res.status(200).json(user); } catch (err) { res.status(500).json(err); }
方式2:用完整的if-else分支结构
如果习惯用分支逻辑,也可以写成嵌套的if-else:
try { const user = await User.findOne({ email: req.body.email }); if (!user) { res.status(404).json("user not found"); } else { const validPassword = await bcrypt.compare(req.body.password, user.password); if (!validPassword) { res.status(400).json("wrong password"); } else { res.status(200).json(user); } } } catch (err) { res.status(500).json(err); }
两种方式都能保证每次请求只发送一次响应,彻底解决重复发送响应头的问题。
内容的提问来源于stack exchange,提问作者George Akhobadze
相关产品推荐
相关产品推荐

