登录输入错误密码触发ERR_HTTP_HEADERS_SENT致应用崩溃求助
解决Error [ERR_HTTP_HEADERS_SENT]错误:登录密码错误时应用崩溃问题
错误原因
这个错误本质是同一个HTTP请求中多次向客户端发送响应。当用户名不存在或密码错误时,你的代码发送了401错误响应,但没有终止后续逻辑,继续执行到最后又发送了200成功响应,导致HTTP响应头被重复设置,最终触发应用崩溃。
修复方案
修改登录路由中的判断逻辑,在发送错误响应后立即终止代码执行,避免后续重复发送响应。
修复后的完整代码
const router = require("express").Router(); const User = require("../models/User"); const CryptoJS = require("crypto-js"); const jwt = require("jsonwebtoken"); //REGISTER router.post("/register", async (req, res) => { const newUser = new User({ username: req.body.username, email: req.body.email, password: CryptoJS.AES.encrypt( req.body.password, process.env.SECRET_KEY ).toString(), }); try { const user = await newUser.save(); res.status(201).json(user); } catch (err) { res.status(500).json(err); } }); //LOGIN router.post("/login", async (req, res) => { try { const user = await User.findOne({ email: req.body.email }); // 用户不存在时返回错误并终止执行 if (!user) { return res.status(401).json("用户名或密码错误!"); } const bytes = CryptoJS.AES.decrypt(user.password, process.env.SECRET_KEY); const originalPassword = bytes.toString(CryptoJS.enc.Utf8); // 密码不匹配时返回错误并终止执行 if (originalPassword !== req.body.password) { return res.status(401).json("用户名或密码错误!"); } const accessToken = jwt.sign( { id: user._id, isAdmin: user.isAdmin }, process.env.SECRET_KEY, { expiresIn: "5d" } ); const { password, ...info } = user._doc; res.status(200).json({ ...info, accessToken }); } catch (err) { res.status(500).json(err); } }); module.exports = router;
关键修改点
- 将原来的短路逻辑(
!user && res.status(...))替换为if判断+return,确保发送错误响应后立即终止后续代码执行 - 密码验证逻辑同理,验证失败时发送响应并
return,避免执行到后续的成功响应代码
这样修改后,当登录验证失败时,代码会在发送错误响应后停止执行,不会再尝试发送成功响应,彻底解决重复设置HTTP头导致的崩溃问题。
内容的提问来源于stack exchange,提问作者Harshil Gajjar
相关产品推荐
相关产品推荐

