【问题标题】:Session of Node API working in postman well but not in browserNode API 的会话在邮递员中运行良好但在浏览器中运行良好
【发布时间】:2017-12-15 07:52:23
【问题描述】:

我正在创建一个用于身份验证的节点 API,在我的节点 API 中我创建了一个登录会话并将其存储。现在的问题是它在邮递员中运行良好,但在浏览器中,它不起作用。我假设它的 cookie 设置有问题,在节点中是新的,请给我一个适当的建议来解决这个问题。我已经给出了代码。

在 app.js 中以这种方式设置 express-session。

app.use(session({ secret: 'middesecrectcode', resave:false, saveUninitialized:true }))

在我的 API 路由中,我已经做到了。

 router.post('/testlogin', function(req, res, next){  
    req.session.username = "midde";
    res.send("Your session has been created as "+ req.session.username); 
    req.session.success = true;
});


router.get('/checkSession', function(req, res, next){
   console.log(req.session.success); 
   if(req.session.username){
    res.send("hello "+req.session.username);  
   } 
   else{
       res.send("session is not SET");
   }
});

router.get('/logout', function(req, res, next){
    req.session.destroy(function(err){
       if(err){
           console.log("Some error received when to logout");
       }
       res.send("You have got logged out successfully");
    });
});

在浏览器中,我通过以下方式调用 API

login.html

<html>
    <head>
        <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>
        <script type='text/javascript' src="login.js"></script>
    </head>

    <body>
      <div>
        <label><b>Username</b></label>
        <input type="text" placeholder="Enter Username" name="uname" id="uname">
        </br>
        <label><b>Password</b></label>
        <input type="password" placeholder="Enter Password" name="psw" id="pwd">
        </br>

        <button id="btn" type="submit">Login</button>
      </div>

      <div>
          <button id="btnSession" type="submit">Check Session</button>
      </div>
    </body>

</html>

login.js

$(document).ready(function(){
    $("#btn").click(function(){
        var uname = $("#uname").val();
        var pwd = $("#pwd").val();

        var dataSet = {
            "username" : uname,
            "password": pwd
            } 
        var data2send = JSON.stringify(dataSet) 
         console.log(data2send);

       $.ajax({
                url: "http://localhost:8080/api/testLogin",
                type: "post",
                data: data2send,
                contentType: 'application/json',
                success: function(d) {
                    alert(d);
                }
            });

    });

    $("#btnSession").click(function(){   
       $.ajax({
                url: "http://localhost:8080/api/checkSession",
                type: "get",
                contentType: 'application/json',
                success: function(d) {
                    alert(d);
                }
            });

    });

});

【问题讨论】:

  • 你试过在浏览器中使用邮递员生成的代码吗? getpostman.com/docs/postman/sending_api_requests/…
  • 您是否收到错误响应?比“它不起作用”更具体
  • @Baksteen ,不,我没有收到任何错误,调用“testlogin”API 时,得到“您的会话已创建为 midde”的响应,现在在检查会话时,它响应“会话未设置”。

标签: javascript node.js express


【解决方案1】:

我认为你的问题在于你在req.session.success = true;之前调用res.send

在发送回复之前,请确保您已完成所有工作。尝试像这样交换这些行:

router.post('/testlogin', function(req, res, next){  
    req.session.username = "midde";        
    req.session.success = true;
    res.send("Your session has been created as "+ req.session.username); 
});

【讨论】:

  • 此更改存在同样的问题,在邮递员上成功工作(会话被存储)但不在浏览器中。
  • 您确定在浏览器中执行 POST 请求吗?
  • 当我调用“testlogin”,然后执行 POST 请求,当只是检查会话然后根据创建的 API 执行 GET 请求时,您能告诉我是否需要将 cookie 存储在浏览器上或不带它??我想我犯了一些愚蠢的错误,但找不到。
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多