Express跳转触发ERR_HTTP_HEADERS_SENT错误,求原因及解决方法
错误原因分析与修复方案
这个错误Error [ERR_HTTP_HEADERS_SENT]的核心是:在同一个HTTP请求中,你尝试多次发送响应头/响应内容。HTTP协议要求一个请求只能对应一个完整响应,重复发送就会触发这个报错。
你的代码里有两处关键问题:
1. /login 路由里的重复响应
在登录路由中:
- 登录成功时,
response.redirect('Admin')已经会自动发送响应并结束请求,但之后你又调用了response.end(),属于第二次结束请求。 else分支里,response.send()本身就会自动结束响应,后续的response.end()完全多余,是重复操作。
2. /Admin 路由里的异步操作后重复响应
在Admin路由中:
- 用户已登录时,
activeEmails()是异步Promise操作,你在then里调用res.render(),但不管异步操作是否完成,函数最后都会执行res.end()。res.render()是异步的,它会在模板渲染完成后自动发送响应并结束请求,此时再执行res.end()就会导致重复发送响应头。 - 未登录分支里的
res.redirect('login')同样会自动结束请求,后续的res.end()也是多余的重复操作。
修正后的代码
修正后的 /login 路由:
app.post('/login', function(request, response) { let username = request.body.username; let password = request.body.password; console.log(username); console.log(password); if (username && password) { con.query('SELECT * FROM something WHERE user = ? AND password = ?', [username, password], function(error, results, fields) { if (error) throw error; if (results.length > 0) { request.session.loggedin = true; request.session.username = username; response.redirect('Admin'); // redirect会自动结束响应,无需再调用end() } else { response.send('Incorrect Username and/or Password!'); // send会自动结束响应 } // 移除多余的response.end() }); } else { response.send('Please enter Username and Password!'); // send会自动结束响应 // 移除多余的response.end() } });
修正后的 /Admin 路由:
app.get('/Admin', function (req, res) { if (req.session.loggedin) { activeEmails() .then((result) => { var email = result; console.log(email); res.render('Admin', { // render完成后自动结束响应 email : email }); }); } else { res.redirect('login'); // redirect会自动结束响应 } // 移除函数末尾的res.end() });
补充说明
Express的res.redirect()、res.send()、res.render()这些方法内部都会自动调用res.end()来结束请求,所以你不需要手动再调用一次,否则就会触发重复发送响应的错误。
内容的提问来源于stack exchange,提问作者Jeremiah Rodriguez
相关产品推荐
相关产品推荐

