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

时间:2016-09-30 16:38:18

标签: node.js express

我刚刚开始学习如何在节点和快递中使用cookie,我希望得到一些帮助来实现这一点。我尝试按照GitHub上的expressjs/session教程进行操作,但我将req.session作为undefined,因此我无法设置或获取任何值。

我的目标是将用户的名字和姓氏保存到cookie,以便自动填充输入字段。我不确定是否需要使用cookie-parser,或者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; 。我不确定如何继续,因为我不熟悉cookie和快速会话。

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

代码

with open('filename', 'w') as f:
    for elem in a:
        f.write('{} {}\n'.format(elem[0], ' '.join(str(i) for i in elem[1])))

4 个答案:

答案 0 :(得分:27)

将路由器安装到Express应用程序后,对于任何以路由器为目标的请求,都不会调用该应用程序上任何后续声明的中间件。

所以如果你有这个:

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

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

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

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

module.exports = app;

答案 1 :(得分:2)

获取会话数据

首先,您必须使用

初始化快速会话
app.use(session({ resave: true ,secret: '123456' , saveUninitialized: true}));

然后当你想在会话中放一些东西

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

然后你可以无错误地检查

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

注意:这是快递会议的工作!

答案 2 :(得分:0)

在尝试维护我的应用程序中的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({...})),也可能会出现此问题。尝试将其置于顶部。

为什么会这样:partial_dependency

答案 3 :(得分:0)

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

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