7

第一个问题
我试图弄清楚会话、商店、授权和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 和 express但没有 redis 讨论会话和存储的站点,另一个使用所有三个讨论会话和存储的站点,但它不使用io.set('store', ...).

我也不知道我是否应该使用两个不同的商店,一个 forexpress和一个 for 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()每个人都使用相同的吗?我是否为每个创建单独的?我只使用expressorsocket.io吗?我真正想要的是能够对客户端进行身份验证(我假设这是通过会话完成的)并让他们在连接时更新 redis 数据库——记录人们何时访问我的网站。这导致了我的第二个问题。


第二个问题
所以我不知道如何从这一点访问和编辑redis数据库。由于我的第一个问题,我无法对此进行测试,但我认为它会是这样的:

io.sockets.on('connection', function(socket){
  var session = socket.handshake.session;
  redis.put(session);
});

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

4

1 回答 1

3

如您所见,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 中。

于 2012-10-05T23:34:27.917 回答