我正在使用 Express 在 NodeJS 上构建一个 Web 应用程序; session 存储是一个 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 请求后,应用程序(显然,自然地)无法识别昨天的 session cookie。更准确地说,失败点是
request.session.regenerate =>
request.session.user = uid_hint
在登录 View 中,消息为TypeError:无法调用未定义的“重新生成”方法
。现在的问题是:
(1) 我的印象是这样的,当我尝试使用配置为在特定端口上请求数据的 session 中间件时,express 不会阻止我,但该端口是根本没有服务?如果是这样,为什么没有错误消息?
(2) 测试该条件的好方法是什么?那时我想要一条有用的消息。
(3) 鉴于数据库实例可能随时变得不可用(尤其是当它通过网络与应用服务器分开时),在这种情况下最佳实践是什么?回到基于内存的 session ?拒绝为客户服务?
(4) 让我们假设我们依靠另一种 session 存储机制。现在所有现有的 session 都变得无效了,对吧?除非我们能够确定来自客户端的给定签名 SID 在没有现有记录的情况下在计算上是否有效。这些 session 仍然缺乏数据,因此尚不清楚这有多大用处。我们不妨扔掉旧的 session 并开始新的 session 。但如何呢? request.session = new (require 'express').session.Session()
,也许?
奖励积分 (我知道有些人会 mock 我问了这么多不同的事情,但我认为以 session 和 cookie 为中心的讨论应该包括以下方面)
仔细想想,我对使用 Redis 感到有点不满意——不是因为它是 Redis,而是因为我在应用程序中还有另一个 DB make。使用 session 数据库的理论上的替代方法可能是一种相当安全的方法来保存所有 session 数据(不是用户 ID 数据,没有信用卡号码 - 只是一般的东西,比如您来自 cookie 中的页面等)。这样,任何一个服务器进程都可以接受请求,并拥有所有可用的 session 数据来正确响应。我知道 cookie 存储空间是有限的(比如 4kB),但这可能仍然足够了。这里有什么中间件可以推荐吗?或者这个想法太愚蠢/不安全/太 1990 年了?
最佳答案
connect-reddis 监听 redis 的 error 事件
./lib/connect-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');
});
关于node.js - NodeJS/express/connect-redis : no error on redis being down; session missing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20315612/