NodeJS / express / connect-redis:Redis没有错误; 会议缺失

我正在使用快速在NodeJS上构build一个Web应用程序; 会话存储是我使用connect-redis谈话的一个Redis实例。 通常的位看起来像,通常:

 RedisStore = ( require 'connect-redis' ) express express_options = ... 'session': 'secret': 'xxxxxxxx' 'store': new RedisStore host: '127.0.0.1', port: 6379, ttl: 2 * weeks 'cookie': maxAge: 2 * weeks app = express() # Middleware ... app.use express.cookieParser 'yyyyyy' app.use express.session express_options[ 'session' ] ... 

这确实如此。 不过,我还没有妖魔化Redis。 在启动服务器(但不是Redis)并重新发出来自浏览器的HTTP请求之后,应用程序(显然自然地)不能识别昨天的会话cookie。 更准确地说,失败的原因是

  request.session.regenerate => request.session.user = uid_hint 

在login视图中,消息是TypeError: Cannot call method 'regenerate' of undefined 。 现在的问题是:

(1)我的印象是真的,当我尝试使用configuration为在特定端口上请求数据的会话中间件时,express并不会妨碍我,而该端口根本没有服务? 如果是这样,为什么没有错误信息?

(2)testing这种情况的好方法是什么? 我想在这一点上有帮助的消息。

(3)由于数据库实例可能在任何时候都不可用,特别是当它由networking与应用程序服务器分离时,这种情况下的最佳实践是什么? 回到基于记忆的会话? 拒绝为客户服务?

(4)让我们假设我们回到另一个会话存储机制。 现在所有的会议都已经失效了吧? 除非我们能够决定在没有现有logging的情况下,来自客户的给定的签署的SID在计算上是否有效。 这些会议仍然缺乏数据,所以目前尚不清楚这将是多么有用。 我们不妨扔掉旧的会议并开始新的会议。 但是如何? request.session = new ( require 'express' ).session.Session() ,也许?

积分 (我知道有些人会嘲笑我问这么多不同的事情,但我认为围绕会话和cookie的讨论应包括以下方面)

思考一下,我有点不高兴,我使用Redis – 不是因为它是Redis,而是因为我还有另一个数据库在应用程序中。 使用会话数据库的理论替代方法可能是一种合理安全的方法,可以在cookie中保留所有会话数据( 不是用户标识数据, 没有信用卡号码 – 只是一般的东西,比如来自哪个页面等)。 这样,任何一个服务器进程都可以接受一个请求,并且拥有所有的会话数据来正确响应。 我知道cookie存储空间是有限的(比如4kB),但是这可能足够了。 任何中间件在这里推荐? 或者是想法愚蠢/不安全/太1990年?

connect-reddis监听redis的错误事件

./lib/connect-redis.js

 self.client.on('error', function () { self.emit('disconnect'); }); 

所以创build商店之后,请听取断开事件

 var store = new RedisStore({ host: 'localhost', port: 6379, db: 2, pass: 'RedisPASS' }); store.on('disconnect', function(){ console.log('disconnect'); });