redis刷新时,node.js会话未定义

时间:2014-03-02 19:36:23

标签: node.js session express connect session-management

最有可能解决方案是微不足道的,但我对文档并不满意。 我正在使用express-session中间件和connect-redis会话存储,因此它会将会话保持为redis。

在用FLUSHALL刷新redis之后,会话信息当然不再可用了。然后当我请求我的首页时,会发送一个“旧的sid”,其中明确的会话无法在redis中找到,我最终会req.session未定义。这在某种程度上是有意义的 - 因为没有会话信息 - 但我不知道如何正确处理这个。

让我们进一步思考;如果用户在一周后没有返回,我的下一步将是从商店中删除旧会话(以释放随机流量的空间)。所以在那个szenario中,当用户在2周后回来时,我会遇到同样的问题。

所以我的问题是为什么它不创建新会话并在会话库中找不到任何内容时发送新的sid cookie?或者更好的问题而不是为什么,我怎么能做到这一点?

req.session.regenerate()是显而易见的方法,但由于req.sessionundefined,否则无法做到:(

感谢您对此情况的任何见解!

/ edit:这是我的会话代码;

var ExpressRedisStore = require('connect-redis')(express),
sessionStore = new ExpressRedisStore({
    client:redClient
}),
app = express();
//... <- some middleware
app.use(express.bodyParser( {hash : 'md5'} ));
app.use(cookieParser);
app.use(express.session({
    store: sessionStore,
    key: "sid",
    cookie:{
        path: '/',
        httpOnly: true,
        maxAge: 3600*24*1000 //one day!
    },
    trustProxy:true,
    rollingSessions:true
}));
app.use(userHandler.middleware()); //<-- my own middleware for userManagment
                                  // here I fail because req.session is undefined

1 个答案:

答案 0 :(得分:1)

您的问题几乎可以肯定是您使用快递会话。我无法弄清楚那个包是什么(它似乎是一个未经认可的连接分支),但你不想使用它。 Express plus connect-redis将执行您想要的所有操作,包括在刷新缓存或以其他方式过期时正确重新生成会话。

<强>更新

抱歉,我错过了Express / Connect正在进行大规模重构。但是,当前版本的Express on npm是3.4.8,requires连接2.1.2,它不使用快速会话。因此,请尝试以下方法以使您的项目正常运行:

npm uninstall --save express
npm uninstall --save express-session
npm install --save express
npm install --save connect-redis

这应该可以让您安装正常工作,并且可以按照此connect link获取正确的自述文件。