Node.js'标头已发送'刷新页面时

Node.js 'headers already sent' when page is refreshed

本文关键字:刷新 js Node      更新时间:2023-09-26

登录后刷新我的"会员区"时,我一直会收到这个错误(在一定时间后)。我使用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)激活导致此错误。