护照很棒。我现在发现我对如何处理会话有一些问题。 我一定是错了。
一切都适合我登录+会话+用户数据我存储在我的数据库中。 但是我发现当我转移到生产环境(具有多个服务器的EC2上的云)时,我每次都会丢失登录会话。 这对我来说很清楚 - 可能会发生,因为会话对每个服务器都是唯一的。
所以我的问题是 - 我该如何解决这个问题.. 我想我需要在用户的浏览器上存储我自己的cookie?
这是否意味着我根本不能使用express.session?
谢谢, 伊兰
答案 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() );