Node.js'标头已发送'刷新页面时
Node.js 'headers already sent' when page is refreshed
登录后刷新我的"会员区"时,我一直会收到这个错误(在一定时间后)。我使用response.redirect重定向到该区域(成功)或返回登录表单(错误)。我该怎么解决这个问题?
app.get('/sellers/login', function(request, response) {
if(request.session.sellerId){
response.redirect( '/sellers/area?logged_in=true');
}
else{
response.render('pages/sellers-login');
}
});
app.post('/authenticate', function(request, response) {
if(request.session.sellerId){
response.redirect('/area?logged_in=true');
}
else{
db.authenticate(request.body.loginid, function(err, results) {
if(err){
response.redirect('/sellers/login?err=1&logged_in=false&type=db');
}
else{
if(results.length >=1){
var hash = results[0]['hash'];
var seller_id = results[0]['id'];
bcrypt.compare(request.body.password, hash, function(err, res) {
if(res){
request.session.sellerId = seller_id;
response.redirect('/sellers/area?logged_in=true');
}
else{
response.redirect('/sellers/login?err=1&logged_in=false&type=pMatch');
}
});
}
else{
response.redirect('/sellers/login?err=1&logged_in=false&type=user');
}
}
});
}
});
app.get('/sellers/area', function(request, response) {
if(request.session.sellerId){
response.render('pages/sellers-area');
}
else{
response.redirect('/sellers/login?not_logged_in=true');
}
});
if(request.session.sellerId){
response.redirect('/area?logged_in=true');
}
db.authenticate(request.body.loginid, function(err, results) {
// ....
});
当request.session.sellerId
通过调用response.redirect
计算为true
时,您将发送标头,但之后将继续使用db.authenticate
。在该回调中,您将进行另一次重定向,即使您已经对该响应进行了重定向。
在db.authenticate
内部,if(err)
也有同样的问题
编辑
对于if (request.session.sellerId)
和if (err) {
,都需要使用else
块(或return
if (request.session.sellerId) {
response.redirect('/area?logged_in=true');
} else {
db.authenticate(request.body.loginid, function(err, results) {
if (err) {
response.redirect('/sellers/login?err=1&logged_in=false&type=db');
} else if (results.length >= 1) {
var hash = results[0]['hash'];
var seller_id = results[0]['id'];
bcrypt.compare(request.body.password, hash, function(err, res) {
if (res) {
request.session.sellerId = seller_id;
response.redirect('/sellers/area?logged_in=true');
} else {
response.redirect('/sellers/login?err=1&logged_in=false&type=pMatch');
}
});
} else {
response.redirect('/sellers/login?err=1&logged_in=false&type=user');
}
});
}
我想我已经准确地找到了错误的来源,它位于数据库中
//db.js
exports.authenticate = function(loginid, callback) {
var sql = "select ...";
pool.getConnection(function(err, connection) {
if(err) {
console.log(err);
callback(true);
return;
}
connection.query(sql, [loginid], function(err, results) {
connection.release();
if(err) {
console.log(err);
callback(true);
return;
}
callback(false, results);
});
connection.on('error', function(err) {
console.log(err);
connection.release();
callback(true);
return;
});
});
};
connection.on('error',...
被调用,因此callback(true)
激活导致此错误。
相关文章:
- 强制模板刷新ember.js
- PHP和JS脚本的奇怪问题,在我刷新页面之前第一次失败
- Angular JS和Node路由/布线-仅在页面刷新后显示数据
- Node.js:每次刷新/访问时都会有新的会话
- 使用Knockout-Kendo.js库刷新KendoDropDown
- 使用js刷新页面的间隔
- 如何在同一页面上使用windows.location.href将js值传递给php时停止刷新页面
- 如何使用 List.js 正确刷新列表
- React/Node应用程序中的Facebook评论插件.js仅在刷新时显示
- 使用挖空.js如何刷新 Select 元素中的可观察数组
- 5 秒后加载页面而不刷新 JS
- 使用JS刷新部分页面
- 如何在不刷新 node.js 和 ejs 的情况下提交表单
- 在刷新JS时滑动到顶部
- 使用自定义的自动刷新js代码会产生冲突
- JavaScript/AngularJS:强制刷新js和css文件
- 刷新JS脚本而不重新加载页面
- 使用从外部文件获取数据的appendchild命令自动刷新JS
- 如果内容改变,自动刷新JS数组
- SSE与刷新js命令