Express项目刷新页面触发ERR_HTTP_HEADERS_SENT错误服务崩溃如何解决
问题根因
你遇到的ERR_HTTP_HEADERS_SENT错误本质是同一个HTTP请求中多次调用了响应发送方法(res.json/res.send等),导致Express重复设置响应头触发报错。结合你的代码,核心触发点是passport.js中deserializeUser函数重复调用done方法,导致同一次请求的路由逻辑被执行两次。
修复方案
1. 修复passport.js反序列化用户重复调用done的问题
原有代码同时使用回调和Promise链式调用处理用户查询,会触发两次done执行,导致后续路由/中间件逻辑被重复执行,是偶现报错的核心原因。
// 修复后的deserializeUser passport.deserializeUser((id, done) => { User.findById(id) .then((user) => { done(null, user); }) .catch((err) => done(err)); });
2. 修复LocalStrategy密码错误的返回逻辑
原有代码密码错误时返回done(null, true),会把布尔值true当做用户对象传入后续登录逻辑,不符合Passport的设计规范。
// 密码校验分支修复 if (isValid) { console.log("Logged in"); return done(null, user); } else { console.log("Wrong Password"); return done(null, false, { msg: '密码错误' }); }
3. 修复index.js根路由查询逻辑冲突问题
原有代码同时给Mongoose查询传入回调又接.then,会导致查询结果被重复处理,存在逻辑隐患。
// 修复后的根路由 router.get("/", isAuth, (req, res) => { User.find({}) .then((users) => { const userMap = {}; users.forEach(user => { userMap[user._id] = user; }); res.status(200).json({ user: req.user, auth: true, response: userMap }); }) .catch((err) => { console.log(err); res.sendStatus(500); }); });
4. 修复App.js session配置错误
原有session配置中cookie字段嵌套了多余的cookie对象,属于配置错误:
// 修复后的session cookie配置 cookie: { secure: false, maxAge: 1000 * 60 * 60 * 24, }
5. 可选优化:注册路由等待数据库操作完成再返回
原有代码不等用户保存完成就直接返回200,可能出现数据库写入失败但前端收到成功响应的问题:
router.post("/register", async (req, res) => { const saltHash = genPassword(req.body.repeatPassword); const newUser = new User({ username: req.body.firstInput, fName: "", lName: "", title: "", hash: saltHash.hash, salt: saltHash.salt, }); try { await newUser.save(); res.sendStatus(200); } catch (err) { console.log(err); res.sendStatus(500); } });
内容的提问来源于stack exchange,提问作者DrakeColeman
相关产品推荐
相关产品推荐

