NodeJS / express / connect-redis:redis关闭时没有错误;会话缺失

时间:2013-12-01 18:25:21

标签: node.js session express redis

我正在使用express在NodeJS上构建一个Web应用程序;会话存储是一个Redis实例,我使用connect-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

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

(1)我的印象是真的,当我尝试使用配置为在特定端口上请求数据的会话中间件时,express不会对我不感兴趣,但该端口是根本不服务?若然,为何没有错误讯息?

(2)测试该条件的好方法是什么?那时我想要一条有用的信息。

(3),因为数据库实例可能在任何时候都不可用 - 尤其是当它被网络与应用服务器分开时 - 在这种情况下最佳做法是什么?回归基于记忆的会话?拒绝为客户服务?

(4)让我们假设我们回到另一个会话存储机制。现在所有现有的会话都变得无效了吧?除非我们能够在没有现有记录的情况下决定从客户端进入的给定签名SID是否在计算上有效。那些会议仍然没有数据,所以不清楚它会有多大用处。我们不妨扔掉旧会议并开始新会议。但怎么样? request.session = new ( require 'express' ).session.Session(),也许?

奖励积分 (我知道有些人会因为询问这么多不同的事情而嘲笑我,但我认为以会话和Cookie为中心的讨论应包括以下方面)

想一想,我有点不高兴,我根本不使用Redis - 不是因为它是Redis,而是因为我在应用程序中还有另一个数据库。使用会话数据库的理论替代方案可能是保持所有会话数据的合理安全方式(用户ID数据, NO 信用卡号码 - 只是一般的东西,如页面你是否来自cookie)。这样,任何一个服务器进程都可以接受请求并拥有所有会话数据以便正确响应。我知道cookie的存储空间是有限的(如4kB),但这可能仍然足够了。在这里推荐任何中间件? 1990年的想法是愚蠢/不安全吗?

1 个答案:

答案 0 :(得分:2)

connect-reddis侦听redis以查找错误事件

./ LIB /连接-redis.js

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

因此,在创建商店后,请收听断开连接事件

var store = new RedisStore({
    host: 'localhost',
    port: 6379,
    db: 2,
    pass: 'RedisPASS'
 });

store.on('disconnect', function(){
console.log('disconnect');
});