刷新页面时,已经发送了Node.js的标题

时间:2015-11-14 20:30:30

标签: javascript node.js

我在登录后刷新我的“会员区”时,一直收到此错误(在一定时间后)。我使用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');
    }

});

2 个答案:

答案 0 :(得分:2)

if(request.session.sellerId){
    response.redirect('/area?logged_in=true');
}

db.authenticate(request.body.loginid, function(err, results) {
    // .... 
});

您可以通过致电request.session.sellerId,在true评估为response.redirect时将标头发送给db.authenticate,但之后继续db.authenticate。 在该回调中,您将进行另一次重定向,即使您已经进行了该响应的重定向。

if(err)内部else

存在同样问题

修改

您需要对returnif (request.session.sellerId)

使用if (err) {块(或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'); } }); }
$user_result

答案 1 :(得分:0)

我想我已经找到了错误源自db.authenticate的错误位置

 //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)会激活导致此错误。