2017-04-03 58 views
0

我试图实现在此基础上回答一个基本的登录机制: https://stackoverflow.com/a/8003291/5111904快速登录并重定向使用Node.js的

在我的后端我处理登录post要求是这样的:

app.post('/login', function (req, res) { 
    console.log(req.body); 
    if (req.body.user === 'normal' && req.body.password === '12345') { 
     req.session.user_id = 0; // This is failing (req.session is undefined) 
     res.redirect('/index'); 
    } else { 
     res.send('Bad user/pass'); 
    } 
}); 

服务器正在使用https

server = https.createServer(https_options, app).listen(PORT, HOST);

当第E客户机点击登录按钮是越来越执行该代码:

function postLogin(){ 
    var url = "/login"; 
    var xhr = new XMLHttpRequest(); 
    var data = { 
     user: userInput.value, 
     password: passwordInput.value 
    }; 

    xhr.open("POST", url, true); 
    xhr.onreadystatechange = function (oEvent) { 
     if(xhr.readyState === 4){ 
      // Checking status codes 
      if(xhr.status === 200){ 
       onSuccess(xhr.responseText, xhr.responseType); 
      } 
      else{ 
       console.log(xhr.status); 
       onError(); 
      } 

     } 
    } 
    xhr.setRequestHeader("Content-type", "application/json; charset=UTF-8"); 
    console.log("Sending this data: " + JSON.stringify(data)); 
    xhr.send(JSON.stringify(data)); 
} 

登录用户应重定向到索引页面后:

app.get('/index', (request, response) => { 
    response.render('main', {}); 
}) 

所以我得到了这个问题:

  • 在第一个代码段中,req.session未定义
  • 在secod片段中,(xhr.responseText)的值计算为html的 索引页面(用户应该被重定向)
  • 如何以正确的方式将用户重定向到索引页面?

将只有一个有效的用户,所以这个代码不打算被许多人使用,它应该只提供一个基本的安全类型。

+0

你有没有进口'快车session',如:'导入会话从“快车session'' –

+0

@AnushShrestha我没有 - 我想这应该解决'undefined'问题 - 将尝试 - TY –

+0

@AnushShrestha我安装了软件包,并像这样包含它:'const session = require('express-session')' - 仍然有未定义的问题 –

回答

1

实际上有三个问题在这里:

  1. 使用与快递

在快递会议上,如果你想使用会话,你需要把它初始化为中间件到应用程序。在它的文档中有一个详细的指南:https://github.com/expressjs/session

app.use(session({ 
    secret: 'keyboard cat', 
    cookie: { secure: true } 
})) 

该中间件将添加session方法您req对象上,你现在可以使用req.session

基本上,你写出来之前,你的路线,你需要在你的应用程序是这样的。

  1. 接收到xhr.responseText中的html值。

我相信你误解AJAX如何(或XMLHttpRequest的是特定的)的作品。如果请求服务器发送重定向头,浏览器会自动遵循重定向,您将不会意识到这一点,最后会得到最终响应(除了这个answer之外,我找不到任何真实的文档。您的AJAX请求会在重定向之后发送给您最终响应。

  • 重定向到索引页面的正确方式
  • 与AJAX工作的正确方法是让你的网页是如何工作的前端所有的控制。因此页面之间重定向的责任也落在前端。在你的情况下,最好的方法是发送一个请求到/login来登录用户。响应将有一个状态代码来确定成功或失败(成功为200,失败可能为401)。然后您可以检查响应的状态并重定向。

    在后端:

    app.post('/login', function (req, res) { 
        if (req.body.user === 'normal' && req.body.password === '12345') { 
         req.session.user_id = 0; 
         res.status(200).send('User logged in'); 
        } else { 
         res.status(401).send('Bad user/pass'); 
        } 
    }); 
    

    在前端:

    xhr.onreadystatechange = function (oEvent) { 
        if(xhr.readyState === 4){ 
         // Checking status codes 
         if(xhr.status === 200){ 
          // user logged in 
          window.location = '/index'; 
         } 
         else{ 
          // login failed 
          console.log(xhr.status); 
          onError(); 
         } 
    
        } 
    } 
    
    +0

    工作正常,ty-bu t notice:'user_id = 0'将在'chekAuth'函数中计算if case to false:'if(req.session.user_id)' –