使用express-session未定义req.session [英] req.session is undefined using express-session

查看:152
本文介绍了使用express-session未定义req.session的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am just starting to learn how to use cookies with node and express and I would like some help with getting this to work. I tried to follow the expressjs/session tutorial on GitHub, however I am getting req.session as undefined, so I am unable to set or get any values.

我的目标是将用户的名字和姓氏保存到cookie中,以便自动填充输入字段.我不确定是否还需要使用cookie-parserexpress-session是否可以单独处理.我不知道如何进行操作,因为我是Cookie和Express会话的新手.

My goal is to save the first and last name of a user to a cookie so that an input field will auto populate. I'm not sure if I need to use cookie-parser as well or if express-session can handle that alone. I'm not sure of how to proceed as I am new to cookies and express-session.

感谢所有帮助!预先感谢.

All help is appreciated! Thanks in advance.

代码

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;

推荐答案

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

Once you mount a router onto an Express app, any subsequently declared middleware on that app won't get called for any requests that target the router.

所以,如果您有这个:

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

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

The session middleware won't get called for any requests that get handled by router (even if you declare the routes that the router should handle at some later point). For that, you need to change the order:

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

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

An additional issue is that you're exporting router, which should probably be app (which is the instance that "holds" all the middleware, routers, etc):

module.exports = app;

这篇关于使用express-session未定义req.session的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆