javascript - 刷新页面时 Node.js 'headers already sent'

标签 javascript node.js

当我登录后刷新“成员(member)区”时,我不断收到此错误(在一段时间后)。我使用 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 时发送 header 计算结果为 true通过调用 response.redirect ,但您继续使用 db.authenticate然后。 在该回调内部,您将执行另一个重定向,即使您对该响应的重定向已经发生。

db.authenticate内部您与if(err)有同样的问题

编辑

您需要使用 else return block (或 if (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');
    }
  });
}

关于javascript - 刷新页面时 Node.js 'headers already sent',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33713010/

相关文章:

javascript - 在node.js和socket.io中向单个套接字发送消息

node.js - Jasmine 测试相互依赖

javascript - 无法设置未定义或空引用的属性 'innerText'

javascript - Node 进程对象可用于浏览器客户端代码

javascript - 正则表达式:匹配 DNA 序列的排列

node.js - 什么是Ejs,EJS有什么用?

javascript - 将 HTML 变量动态分配给 AS3 变量

javascript - bool 柯里化(Currying) Javascript

javascript - AngularJs 和套接字服务器

html - 通过 Express/Node JS 将配置文件从 HTML 编辑到 MongoDB