【问题标题】:req.session is undefined using express-sessionreq.session 使用 express-session 未定义
【发布时间】:2020-09-02 11:56:38
【问题描述】:

我刚刚开始学习如何将 cookie 与 node 和 express 一起使用,我希望得到一些帮助以使其正常工作。我尝试按照 GitHub 上的 expressjs/session 教程进行操作,但是我得到的 req.sessionundefined,因此我无法设置或获取任何值。

我的目标是将用户的名字和姓氏保存到 cookie 中,以便自动填充输入字段。我不确定我是否也需要使用cookie-parser,或者express-session 是否可以单独处理。我不知道如何进行,因为我是 cookie 和 express-session 的新手。

感谢所有帮助!提前致谢。

代码

let express = require('express');
let app = express();
let credentials = require('../modules/credentials.js');
let session = require('express-session');
let sessionOptions = {
  secret: credentials.cookieSecret,
  cookie: {
    maxAge:269999999999
  },
  saveUninitialized: true,
  resave:true
};

if (app.get('env') === 'production') {
  app.set('trust proxy', 1);
  sessionOptions.cookie.secure = true;
}
else {
  sessionOptions.cookie.secure = false;
}

app.use(session(sessionOptions));
let router = express.Router();
app.use(router);

let request = require('request');
let db = require('../modules/queries');
let bodyParser = require('body-parser');
let cookieParser = require('cookie-parser');


// app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

router.get('/me', function(req, res, next) {
  console.log('req.session: '+req.session);

  let firstName = req.session.firstName;
  let lastName = req.session.lastName;
  if (firstName && lastName) {
    res.render('student/me.jade', {firstName, lastName});
  }
  else {
    res.render('student/me.jade', { firstName: '', lastName: ''});
  }
});

router.post('/api/me', function(req, res, next) {
  let firstName = req.body.firstName;
  let lastName = req.body.lastName;
  // session.firstName = firstName;
  // session.lastName = lastName;
  req.session.firstName = firstName;
  req.session.lastName = lastName;
  console.log('session.firstName: '+session.firstName);
  db.addEvent(req, res, next);
});

module.exports = router;

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    一旦您将路由器安装到 Express 应用上,随后在该应用上声明的任何中间件都不会被任何针对该路由器的请求调用。

    如果你有这个:

    app.use(router)
    app.use(session(...));
    

    会话中间件不会被router 处理的任何请求调用(即使您声明了路由器应该稍后处理的路由)。为此,您需要更改顺序:

    app.use(session(...));
    app.use(router);
    

    另一个问题是您正在导出router,它可能应该是app(它是“持有”所有中间件、路由器等的实例):

    module.exports = app;
    

    【讨论】:

    • 谢谢@robertklep - 我做了切换。它没有解决问题,但这有助于了解未来!
    • @RonI req.session 未定义表示会话中间件没有被调用(否则,它将使用空对象填充req.session)。您能否展示(在您的问题中)如何向您的应用添加路由/中间件?
    • @RonI 你是用express-generator创建你的项目的吗?
    • @Ron我看到我关于导出app而不是router的编辑。
    • 不错!我没有看到关于导出应用程序的编辑,我进行了更改,现在可以使用了!谢谢:)
    【解决方案2】:

    获取会话数据

    首先,你必须初始化 express-session

    app.use(session({ resave: true ,secret: '123456' , saveUninitialized: true}));
    

    那么当你想在会话中放一些东西时

    req.session.firstName = 'Aniruddha';
    req.session.lastName = 'Chakraborty';
    

    然后就可以无误地检查了

    console.log('req.session: '+req.session.firstName);
    

    注意:这是快速会话工作!

    【讨论】:

      【解决方案3】:

      我在尝试在我的应用程序中维护 req.session 对象时出现了这个问题。我在登录路线中设置了req.session.user,但在该路线之外无法获得相同的信息。

      console.log(req.session) 
      // undefined
      

      由于我的应用中没有使用cookie,因此我将其删除。

      在删除 cookie 变量之前:

      app.use(
      session({
          resave: false,
          saveUninitialized: true,
          secret: "anyrandomstring",
          cookie: { secure: true},
        })
      );
      

      删除 cookie 变量后:

      app.use(
      session({
          resave: false,
          saveUninitialized: true,
          secret: "anyrandomstring",
        })
      );
      

      这解决了我的问题。现在我可以在应用程序的任何位置访问req.session

      console.log(req.session)
      /* Session{
           ......
           ......
          }
      */
      

      注意:如果您在文件底部初始化了app.use(session({...})),也可能会出现此问题。试着把它带到顶端。

      为什么会这样:Click here

      【讨论】:

        【解决方案4】:

        如果您的 Redis 连接无效或丢失,您还会看到req.session === undefined

        我在您的代码中没有看到在配置会话时传递连接信息的任何地方。

        【讨论】:

        • 他们可能没有使用 Redis 作为他们的存储,而是使用默认的内存存储
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        • 2012-12-09
        • 1970-01-01
        • 2016-04-01
        • 2015-10-15
        • 2023-03-19
        • 2013-12-11
        相关资源
        最近更新 更多