req.session使用快速会话未定义

Ron*_*n I 13 node.js express

我刚刚开始学习如何在节点和表达中使用cookie,我希望得到一些帮助,让它工作.我试着在GitHub上关注expressjs/session教程,但是我得到req.sessionundefined,所以我无法设置或获取任何值.

我的目标是将用户的名字和姓氏保存到cookie中,以便自动填充输入字段.我不确定我是否需要使用cookie-parser,或者是否express-session可以单独处理.我不确定如何继续,因为我不熟悉cookie和快速会话.

所有帮助表示赞赏!提前致谢.

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;
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 35

将路由器安装到Express应用程序后,任何后续声明的应用程序中间件都不会被任何针对路由器的请求调用.

所以,如果你有这个:

app.use(router)
app.use(session(...));
Run Code Online (Sandbox Code Playgroud)

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

app.use(session(...));
app.use(router);
Run Code Online (Sandbox Code Playgroud)

另一个问题是您正在导出router,这应该是app(这是"保留"所有中间件,路由器等的实例):

module.exports = app;
Run Code Online (Sandbox Code Playgroud)


Dee*_*pta 6

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

console.log(req.session) 
// undefined
Run Code Online (Sandbox Code Playgroud)

由于我的应用程序中没有使用cookie,所以我将其删除。

删除 cookie 变量之前:

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

删除 cookie 变量后:

app.use(
session({
    resave: false,
    saveUninitialized: true,
    secret: "anyrandomstring",
  })
);
Run Code Online (Sandbox Code Playgroud)

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

console.log(req.session)
/* Session{
     ......
     ......
    }
*/
Run Code Online (Sandbox Code Playgroud)

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

为什么会发生这种情况:点击这里


Ani*_*rty 5

获取会话数据

首先,您必须使用

app.use(session({ resave: true ,secret: '123456' , saveUninitialized: true}));
Run Code Online (Sandbox Code Playgroud)

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

req.session.firstName = 'Aniruddha';
req.session.lastName = 'Chakraborty';
Run Code Online (Sandbox Code Playgroud)

然后你可以检查没有错误

console.log('req.session: '+req.session.firstName);
Run Code Online (Sandbox Code Playgroud)

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