Node + Passport.js + Sessions +多个服务器

时间:2014-09-24 20:40:59

标签: node.js session cloud multiple-instances passport.js

护照很棒。我现在发现我对如何处理会话有一些问题。 我一定是错了。

一切都适合我登录+会话+用户数据我存储在我的数据库中。 但是我发现当我转移到生产环境(具有多个服务器的EC2上的云)时,我每次都会丢失登录会话。 这对我来说很清楚 - 可能会发生,因为会话对每个服务器都是唯一的。

所以我的问题是 - 我该如何解决这个问题.. 我想我需要在用户的浏览器上存储我自己的cookie?

这是否意味着我根本不能使用express.session?

谢谢, 伊兰

2 个答案:

答案 0 :(得分:7)

行, 基本上我正在寻找的东西(不确定它对其他人来说都是相同的答案)是一种在loadbalanced实例之间存储会话数据而不需要为每个页面视图调用DB的方法,这对我来说似乎太过分了,因为我只需要让用户登录Google / FB。

似乎我正在寻找的答案是cookie会话中间件 https://github.com/expressjs/cookie-session

这需要替换使用MemoryStore的默认express.session机制。 BTW MemoryStore本身在运行时会向您发出警告,它不会扩展到单个进程,也可能导致内存泄漏。

如果我理解正确将会话数据本身序列化为会话cookie(加密)而不是仅使用会话cookie中的会话ID。 这对我来说似乎很完美。显然,如果你有很多会话数据我不希望它工作,因为cookie的大小有限。在我的情况下,我只需要名称,ID和头像网址,所以我认为这就足够了。 感谢所有帮助过的人。

答案 1 :(得分:1)

您需要将会话数据存储在所有服务器均可访问的“全局”区域中。这可能是redis或其他数据库。

以MEAN.JS为例。在这里,他们使用express-session与MongoDB存储容器(因为它们是MEAN堆栈;),通过connect-mongo。他们的项目非常容易设置,如果只是一个例子。

设置快递时的代码是这样的:

//top of file
var session = require( 'express-session' )
    mongoStore = require( 'connect-mongo' )( {
        session: session
    } );

//...later in setup

// Express MongoDB session storage
app.use( session( {
    saveUninitialized: true,
    resave: true,
    secret: config.sessionSecret,
    store: new mongoStore( {
        db: db.connection.db,
        collection: config.sessionCollection
    } )
} ) );

// use passport session
app.use( passport.initialize() );
app.use( passport.session() );