在生产中使用MemoryStore

今天,我第一次在“生产”模式下运行我的Node.js应用程序,并得到这样的警告:

Warning: connection.session() MemoryStore is not designed for a production environment, as it will leak memory, and obviously only work within a single process. 

我只需要运行一个进程,但是我应该使用什么呢? 我希望我的会话驻留在RAM中以便快速访问。 我也希望能够通过简单地closuresNode应用程序来放弃所有的会话。

安装Redis,MongoDB或其他数据库只是为了完成这个简单的任务似乎是一个矫枉过正的事情。 我也不明白为什么包含在Node中的MemoryStore不应该真的被使用?

MemoryStore仅用于(快速)开发模式,因为如果您的应用程序重新启动(进程死亡),您将丢失所有会话数据(驻留在该进程的内存中)。

如果您不想使用数据库,请改用encryption的Cookie存储。

http://www.senchalabs.org/connect/cookieSession.html

好的,在与Connect开发者交谈之后,我得到了更多的信息。 有两件事情在这里被认为是内存泄漏:

  1. JSONparsing的问题已经在最近的版本中解决了
  2. 事实上,如果用户永远不会访问它们,就不会清除过期的会话(即唯一的清理就是访问)

解决scheme似乎相当简单,至less这是我打算做的:使用setInterval定期清理过期的会话。 MemoryStore提供all()来获取列表,我们可以使用get()来强制读取,从而使它们过期。 伪代码:

 function sessionCleanup() { sessionStore.all(function(err, sessions) { for (var i = 0; i < sessions.length; i++) { sessionStore.get(sessions[i], function() {} ); } }); } 

现在只需通过setInterval()定期调用sessionCleanup,并为过期的会话自动垃圾收集。 没有更多的内存泄漏。

所以接受的答案是[编辑:]几乎是一个黑客,其他人只是build议使用我认为是矫枉过正的数据库。

我有同样的问题,只是用cookie会话取代快速会议 。

要做到这一点,只需安装cookie-session

 npm install cookie-session 

然后在你的app.js ,find正在使用express-session的地方,并用cookie-sessionreplace。

 app.use(require('cookie-session')({ // Cookie config, take a look at the docs... })); 

你可能需要改变一些其他的东西,因为我是一个简单的交换 – 你的叔叔,没有伤害。

我认为networking上的共识是正确的方法是确实使用数据库,但如果你是积极的,你不想这样做,然后压制警告 – 警告不是法律。

然而,既然你和我都同意内存泄漏是一个真正的问题,很难说redis是矫枉过正的,因为它可以解决你的问题。

我也不明白为什么在应用程序中不包含MemoryStore

这是一个伟大的观点 – 但我要说节点本身只是在最近才成为生产准备 。 有些人不同意这个概念。

这个模块被devise来处理内存泄漏问题。 https://www.npmjs.com/package/session-memory-store

接受的答案可能没有问题。 但是,由于这个问题在search结果列表中显示出很高的含义,所以我想把它包括在内以防其他人帮助。

另一种方法是使用Redis或Mongo作为商店。 使用Mongo,你可以使用express-session-mongo模块。

有一个build议,通过索引选项删除过时的会话:

 var MongoStore = require('express-session-mongo'); app.use(express.session({ store: new MongoStore() })); db.sessions.ensureIndex( { "lastAccess": 1 }, { expireAfterSeconds: 3600 } ) 

由于陈旧会话被数据库本身删除,Express会话不需要自行处理清理。

编辑 :这似乎你需要有你自己的“lastAccess”字段。 当你访问它时,你自己更新该字段。 检查MongoDB文档expire-data http://docs.mongodb.org/manual/tutorial/expire-data/

编辑2

现在变成db.sessions.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )

Mongo后台线程检查此字段每60秒运行一次。 所以删除文档的时间并不准确。

对于Redis有问题的用户,请尝试以下操作 – 希望这有助于您。

我正在使用Redis进行DEV和PROD,并针对Express v4。 在Windows上,我使用的是轻量级MSOpenTech Redis v3.0工具集,否则,我只使用Heroku Redis插件。 通过Node得到它的工作并不难 – 到目前为止…

 var session = require('express-session'); . . . var RedisStore = require('connect-redis')(session); var redisClient = require('redis').createClient(process.env.REDIS_URL); var redisOptions = { client: redisClient, no_ready_check: true, ttl: 600, logErrors: true }; var redisSessionStore = new RedisStore(redisOptions); app.use(session({ store: redisSessionStore, secret: 'Some.Long.Series.of.Crazy.Words.and.Jumbled.letter.etc', resave: true, saveUninitialized: true })); 

祝你好运!

PS。 我只是重新读取原来的查询,并注意到这一点 – 对不起!

安装Redis,MongoDB或其他数据库只是为了完成这个简单的任务似乎是一个矫枉过正的事情。