在 node.js 中,如何使用 socket.io 和 express 设置 redis?具体使用 RedisStore()

Posted

技术标签:

【中文标题】在 node.js 中,如何使用 socket.io 和 express 设置 redis?具体使用 RedisStore()【英文标题】:In node.js, how do I setup redis with socket.io and express? Specifically using RedisStore() 【发布时间】:2012-09-27 03:23:03 【问题描述】:

第一个问题 我试图弄清楚会话、商店、授权和redis。如果它很重要,我使用Express@3.0.0rc4。我知道我有两个选项可以输入我的RedisStore()。我用哪一个?我两个都用吗?

express.session(secret: 'secret', key: 'key', store: new RedisStore());
io.set('store', new RedisStore());

我已经在运行 node.jsexpresssocket.io。所以现在我正在尝试实现redis,但我不知道如何使用会话/存储来实现授权,也不知道如何写入redis数据库。我还没有找到任何关于此的文档。我找到了一个使用socket.io and express 讨论会话和存储但没有redis 的网站,另一个讨论会话和存储using all three,但它不使用io.set('store', ...)

我也不知道我是否应该使用两种不同的商店,一种用于express,一种用于socket.io,或者我应该只使用一种。请看示例进行说明:

//Redis Variables
var redis = require('socket.io/node_modules/redis');
var RedisStore = require('socket.io/lib/stores/redis');
var pub = redis.createClient();
var sub = redis.createClient();
var client = redis.createClient();
var redis_store = new RedisStore(
                        redisPub: pub,
                        redisSub: sub,
                        redisClient: client
                      );

app.configure(function()
  //...code goes here...
  app.use(express.session(
                    secret: 'secret',
                    key: 'key',
                    store: redis_store  //Notice I'm using redis_store
                  ));
  //...more code...
);

io.configure(function()
  io.set('store', redis_store);  //Notice it's the same RedisStore() being used
);

我是否为每个人使用相同的RedisStore()?我是否为每个创建单独的?我只使用express 还是socket.io?我真正想要的是能够对客户端进行身份验证(我假设这是通过会话完成的)并让他们在连接时更新 redis 数据库——记录人们何时访问我的网站。这导致了我的第二个问题。


第二个问题 所以我不知道如何从这一点访问和编辑redis数据库。由于我的第一个问题,我无法对此进行测试,但我认为它会是这样的:
io.sockets.on('connection', function(socket)
  var session = socket.handshake.session;
  redis.put(session);
);

我也没有看到任何关于如何从 node.js 中更新 redis 数据库的文档,所以我非常怀疑 redis.put() 是正确的术语哈哈。我访问过redis's website,但找不到node.js 的命令。只是从命令行使用常规 redis 的命令。无论如何,如果有人至少可以为我指出正确的方向,那就太好了。谢谢。 :)

【问题讨论】:

注意:如果你最终在你的 redis 存储上使用了密码,你需要将 redis 模块本身作为你的 RedisStore 构造函数的一部分传递到 'redis' 键下。欲了解更多信息,请参阅:***.com/questions/13438613/… 【参考方案1】:

如您所见,Express 和 Socket.IO 与 Redis 集成了自己的会话管理功能。它被设计为黑盒集成,其想法是会话存储实现独立于您的其余代码。既然是独立的,那就意味着你不能进去直接使用express或者socket.io来访问Redis。您需要添加一个常规的 redis 客户端,例如 node_redis。好处是您不必担心自己进行所有这些 redis 调用,而是与 express 或 socket.io 的会话存储接口进行交互。

因此,在您的第 1 种情况下,您可以传入一个新的 RedisStore 实例,而不是像您所做的那样传入两个新实例。或者您可以按照您的第二个链接并让 socket.io 通过 express 收听。在这种情况下,它将与快速会话管理集成。这就是为什么您在该示例中看不到额外的 io.set('store') 调用。

您可能觉得它是多余的,但请尝试将 RedisStore 视为专为会话管理而设计的特殊客户端。即使 RedisStore 可能依赖于 node_redis 之类的东西,你也不应该尝试访问它。假设您首先想在 redis 中存储其他非会话项目,则必须包含另一个库来直接访问您的 redis 数据库。

【讨论】:

是的,我正计划将其他内容写入数据库。好的,看看node_redis 我可以看到我已经在使用我的redis 变量访问它,但为了清楚起见,你说我应该npm install redis 与socket.io 处于同一级别,然后将该实例用于我的自己访问数据库?另外,由于我正计划这样做,而我真正想要的 express 或 socket.io 的商店是能够访问会话数据,我是否应该为此使用 RedisStore() ?还是我应该喜欢第一个链接显示并使用 MemoryStore? 是的,您可能想要做的是停止使用 socket.io 包中的 redis 客户端,并在您的项目根目录中包含您自己的客户端。 MemoryStore 还不错,但是如果您想拥有多个 Web 服务器,或者在节点重新启动时保持会话,那么我会坚持使用 RedisStore。如果你想保留 redis 会话,我会考虑 connect-redis 而不是将 redis 存储从 socket.io 项目中拉出来。

以上是关于在 node.js 中,如何使用 socket.io 和 express 设置 redis?具体使用 RedisStore()的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 是聊天模块的理想选择吗

Socket.io - 客户端断开连接后手动重新连接

如何在 Node.js 中使用 HTTPS

如何使用 Passport.js 在 Node.js 中重置/更改密码?

如何在 Cappuccino 中使用 Node.js?

如何在 node.js 中使用 stroph.js 服务器端