在 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.js
、express
和 socket.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()的主要内容,如果未能解决你的问题,请参考以下文章