创建订阅时触发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拼写错误
关键修改点说明
- 调整异步逻辑顺序:把会话设置和所有
res.send移到数据库查询回调内部,确保只有拿到查询结果后才执行响应和会话操作。 - 修复拼写错误:修正了
cookieSession、result.length、module.exports等拼写问题。 - 完善错误处理:用
return res.status(500).send()替代throw err,避免服务器崩溃,同时终止后续代码执行。 - 修正session配置:
maxAge需放在cookie对象下,原配置不生效。 - 确保单次响应:每个分支只调用一次
res.send,避免重复发送HTTP头。
内容的提问来源于stack exchange,提问作者chayangkoon suwitchayangkoon
相关产品推荐
相关产品推荐

