我刚刚开始学习如何在节点和快递中使用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])))
答案 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
!
在配置会话时,我在代码中看不到正在传递连接信息的任何地方。