You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建订阅时触发ERR_HTTP_HEADERS_SENT错误,如何修复?

修复 ERR_HTTP_HEADERS_SENT 错误的方案

错误原因分析

你遇到的ERR_HTTP_HEADERS_SENT错误,核心是多次向客户端发送HTTP响应,同时代码还存在异步逻辑顺序错误和拼写问题:

  • 数据库查询是异步操作,你在MongoClient.connect外部写的if(result.length > 0)逻辑会先执行,这里的result未定义,且这段代码里的res.send会和回调里的res.send重复触发响应。
  • 存在拼写错误:result. Length(多了空格)、module. Exports(多了空格)、cookisSession(拼写错误)。
  • 会话设置逻辑放错位置,应该在确认用户存在后再执行。

修复后的完整代码

const express = require('express');
const app = express();
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb+srv://web:U*****qe8xe@web-nodejs.b5fppl0.mongodb.net/";
const cookieSession = require('cookie-session'); // 修正拼写错误
const bodyParser = require('body-parser');
const session = require('express-session');
const mongodbsession = require('connect-mongodb-session')(session);
const cookieParser = require('cookie-parser');
// const { response } = require('../database'); // 未用到可注释或删除

app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser()); // 配合session使用,建议添加

app.use(session({
   secret: 'Session-service',
   resave: false,
   saveUninitialized: false,
   cookie: { maxAge: 1000 * 60 * 60 * 24 * 7 }, // 修正maxAge配置位置
   store: new mongodbsession({
       uri: 'mongodb+srv://web:U******qe8xe@web-nodejs.b5fppl0.mongodb.net/',
       dbName: 'webjs',
       collection: 'sessions'
   })
}));

app.post('/a-login', (req, res) => {
 const username = req.body.username;
 const password = req.body.password;

 // 密码哈希处理
 const hash = require('crypto').createHash('sha256');
 hash.update(password);
 const password_hash = hash.digest('hex');

 MongoClient.connect(url, function(err, db) {
   if (err) {
     // 替换throw err,返回错误响应给客户端
     return res.status(500).send('数据库连接失败');
   }
   var dbo = db.db("webjs");
   dbo.collection("users").find({ name: username, password: password_hash }).toArray(function(err, result) {
     if (err) {
       db.close();
       return res.status(500).send('查询用户失败');
     }
     if (result.length > 0) { // 修正Length拼写错误
       // 确认用户存在后设置会话
       req.session.username = username;
       req.session.gemd = result[0].gemd;
       req.session.email = result[0].email;
       req.session.id = result[0]._id;
       req.session.save((saveErr) => {
         db.close();
         if (saveErr) {
           return res.status(500).send('会话保存失败');
         }
         res.send("ยินดีต้อนรับคุณ " + username);
       });
     } else {
       db.close();
       res.send("ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง");
     }
   });
 });
});

module.exports = app; // 修正Exports拼写错误

关键修改点说明

  1. 调整异步逻辑顺序:把会话设置和所有res.send移到数据库查询回调内部,确保只有拿到查询结果后才执行响应和会话操作。
  2. 修复拼写错误:修正了cookieSession、result.length、module.exports等拼写问题。
  3. 完善错误处理:用return res.status(500).send()替代throw err,避免服务器崩溃,同时终止后续代码执行。
  4. 修正session配置:maxAge需放在cookie对象下,原配置不生效。
  5. 确保单次响应:每个分支只调用一次res.send,避免重复发送HTTP头。

内容的提问来源于stack exchange,提问作者chayangkoon suwitchayangkoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:27:48