第一个问题
我正在试图找出会话,商店,授权和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数据库 - 记录人们访问我的网站的时间。这导致了我的第二个问题。
<小时/> 第二个问题
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。无论如何,如果有人能够至少指出我正确的方向,那将是伟大的。谢谢。 :)
答案 0 :(得分:3)
Express和Socket.IO有自己的集成Redis进行会话管理,正如您所见。它被设计为黑盒集成,其理念是会话存储实现独立于其他代码。由于它是独立的,这意味着您无法进入并使用express或socket.io直接访问Redis。您需要添加一个常规的redis客户端,如node_redis。好处是您不必担心自己进行所有redis调用,而是将与express或socket.io的会话存储接口进行交互。
所以在你的#1案例中,你可以传递一个新的RedisStore实例,而不是你已经完成的两个新实例。或者你可以按照你的第二个链接,让socket.io通过快递听。在这种情况下,它将与快速会话管理集成。这就是为什么你在这个例子中没有看到额外的io.set('store')调用。
您可能看起来多余,但尝试将RedisStore视为仅为会话管理而设计的特殊客户端。即使认为RedisStore可能依赖于node_redis之类的东西,也不应该尝试访问它。您必须包含另一个库才能直接访问您的redis数据库,假设您想首先在redis中存储其他非会话项。