我正在将Express 4.0与模块express-session
,connect-redis
和passport
一起用于管理会话。一切都可以登录和注销,我可以检索会话等。
但我注意到一些奇怪的事情:即使我是匿名的,如果我要去redis并打字:
$ KEYS *
即使当前没有人连接,Redis也会返回条目1) "sess:VWdwTjPXkITmqQ77xI8cotlltdrz7S8s"
。当我连接时,此键将被另一个与我的会话相对应的键替换。当我退出时,密钥又被另一个密钥更改。当匿名用户调用URL时,我的req.sessionID
也已设置。
在这个网站https://engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile我已经阅读了一些关于创建会话的内容,即使对于匿名(7.无会话),我认为它是相关的。
我在app.js主文件中添加了midwhere:
var
passport = require('passport'),
User = require('../models/user'),
LocalStrategy = require('passport-local').Strategy,
session = require('express-session'),
RedisStore = require('connect-redis')(session);
app.use(session({
store: new RedisStore(app.locals.services.session.config),
secret: 'mysecretstring'
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
即使我从一台新服务器开始,如果我尝试获取我无所事事的主页,我也遇到了问题:
index: function (req, res) {
res.render('home/index');
}
即使在这种情况下,我的redis中也会创建一个新密钥。
注意: 如果我删除这两行,则不会创建任何键。
app.use(passport.initialize());
app.use(passport.session());
所以,我的问题是:如何避免在Redis中为匿名用户创建密钥? (而且,不存储匿名会话是个好主意吗?)。
谢谢!
答案 0 :(得分:0)
如果您不希望为每个请求创建新会话,请在false
中间件中将saveUninitialized
设置为express-session
:
app.use(session({
store : new RedisStore(app.locals.services.session.config),
secret : 'mysecretstring',
saveUninitialized : false,
}));