node.js - NodeJS/express/connect-redis : no error on redis being down; session missing

标签 node.js session express redis

我正在使用 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/

相关文章:

javascript - 在使用nodejs中的请求模块通过post请求发送数据时出现错误

mysql - 从 Google AppEngine Standard 连接到 Google Cloud SQL 实例时出错(使用 NodeJS)

Android应用 session 管理

javascript - Node Express Passport 应用程序尝试登录时出现 404ing

node.js - 如果在 express.js 中既没有调用 res.send() 也没有调用 res.end() 会发生什么?

node.js - 我可以使用 Node.js 访问多少网络堆栈?

ios - 在 iOS 设备上运行 clubbed swift & react-native 项目时出错

django - 无论修改时间如何,使 Django session 过期

codeigniter - chrome codeigniter redis 清除 session 问题

javascript - Express:如何使用 JSON Web token 保护多个路由