【问题标题】:NodeJS express-session req.session is undefinedNodeJS express-session req.session 未定义
【发布时间】:2020-09-29 23:29:53
【问题描述】:

我正在开发一个简单的登录系统,但似乎会话没有保存

我做了一个简单的测试代码,谁能告诉我它有什么问题? 我正在运行登录,之后我正在运行 is_logged 但我从未登录过,并且两个会话都未定义

var port = process.env.PORT || 8080;
var express = require('express');
var app = express();


var cookieParser = require('cookie-parser');
var session = require('express-session');



app.use(cookieParser());
app.use(session({
    secret: "fd34s@!@dfa453f3DF#$D&W", 
    resave: false, 
    saveUninitialized: true, 
    cookie: { secure: true }
}));



 app.post('/test_login', function(req, res){

    req.session.users_schema = 1;
    req.session.user_doc = 2;

    res.json({"first": req.session.users_schema, "second": req.session.user_doc});
});
 app.post('/test_is_loggin', function(req, res){

    if( !req.session.users_schema || !req.session.user_doc ) { 

        console.log("no");
        res.json({"first": 1, "second": 1});
    }
    else {

        console.log("no2");
        res.json({"first": req.session.users_schema, "second": req.session.user_doc});
    }

 });


app.listen(port);
console.log('Listening on port ' + port);

【问题讨论】:

    标签: node.js session express cookies login


    【解决方案1】:

    因为选项cookie.secure = true

    报价

    请注意,secure: true 是推荐的选项。然而,它 需要启用 https 的网站,即,HTTPS 是安全所必需的 饼干。

    https://github.com/expressjs/session#cookie-options

    您必须将其设置为 false,以允许非 https 主机上的会话 cookie,或使用 https 主机。

    测试代码

    var port = process.env.PORT || 8080;
    var express = require('express');
    var app = express();
    
    
    var cookieParser = require('cookie-parser');
    var session = require('express-session');
    
    
    
    app.use(cookieParser());
    app.use(session({
        secret: "fd34s@!@dfa453f3DF#$D&W",
        resave: false,
        saveUninitialized: true,
        cookie: { secure: !true }
    }));
    
    
    
     app.get('/test_login', function(req, res){
    
        req.session.users_schema = 1;
        req.session.user_doc = 2;
    
        res.json({"first": req.session.users_schema, "second": req.session.user_doc});
    });
    app.get('/test_is_loggin', function(req, res){
    
      if( !req.session.users_schema || !req.session.user_doc ) {
    
          console.log("no");
          res.json({"first": 1, "second": 1});
      }
      else {
    
          console.log("OK");
          res.json({"first": req.session.users_schema, "second": req.session.user_doc});
      }
    
    });
    
    
    app.listen(port);
    console.log('Listening on port ' + port);
    

    输出

    [mh-cbon@pc15 test] $ node express-session.js 
    Listening on port 8080
    OK
    

    【讨论】:

    • 感谢您的快速回答,我将其设置为 false 但仍然无法正常工作:/
    • 复制粘贴并添加:app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header(" Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); });但仍然无法正常工作,即使在使用登录名后我也已登录:/
    • 仍然对我有用,有 cookie id,有会话数据,有新的标头。
    【解决方案2】:

    我不确定,但可能与我发送数据的方式有关?

    <script>
    
    var date = new Date("05/05/2016");
    
    
    $.ajax({
    
        type : "POST",
        url : '//localhost:8080/test_login',  
        data : {
    
        },
        success : function(data) {
    
            console.log(data);
        },
        error : function(req, errortype) {
            console.log("ERROR");
        }
    
    });
    
    </script>
    

    ===========================================

    解决了!!!

    这与我发送数据的方式有关,我将其更改为以下内容:

    客户:

    $.ajax({
    
        type : "POST",
        xhrFields: {withCredentials: true},  // ADDED THIS LINE
        url : '//localhost:8080/test_login',
        data : {
    
        },
        success : function(data) {
    
            console.log(data);
        },
        error : function(req, errortype) {
            console.log("ERROR");
        }
    
    });
    

    服务器:

    app.use(function(req, res, next) {
    
        res.header('Access-Control-Allow-Credentials', true);
        res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
        res.header("Access-Control-Allow-Origin", "http://localhost");
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        next();
    });
    

    非常感谢@mh-cbon

    【讨论】:

      【解决方案3】:

      关于更改 Session 配置和路由配置的顺序

      服务器.js

      文件

      之前:错误

      require("./startup/cors")(app);
      require("./startup/passport/passport-setup")();
      require("./startup/logging")();
      require("./startup/validation")();
      //require("./startup/db")();
      require("./startup/prod")(app);
      require("./routes/index")(app);
      
      app.use(
        session({
          secret: 'keyboard cat',//process.env.SESSION_KEY,// Used to compute a hash
          resave: false,
          saveUninitialized: false,
          store: new MongoStore({ mongooseConnection: mongoose.connection }),// Store session on DB
        })
      );
      

      之后:正确

      app.use(
        session({
          secret: 'keyboard cat',//process.env.SESSION_KEY,// Used to compute a hash
          resave: false,
          saveUninitialized: false,
          store: new MongoStore({ mongooseConnection: mongoose.connection }),// Store session on DB
        })
      );
      
      require("./startup/cors")(app);
      require("./startup/passport/passport-setup")();
      require("./startup/logging")();
      require("./startup/validation")();
      //require("./startup/db")();
      require("./startup/prod")(app);
      require("./routes/index")(app);
      

      【讨论】:

        猜你喜欢
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2016-04-01
        相关资源
        最近更新 更多