7

最初の問題
セッション、ストア、承認、およびRedisを把握しようとしています。重要な場合は、を使用してExpress@3.0.0rc4います。私は自分のを置くための2つのオプションがあることを理解していますRedisStore()。どちらを使用しますか?両方使用しますか?

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

私はすでに、、node.jsexpress実行しsocket.ioています。だから今私は実装しようとしてredisいますが、セッション/ストアを使用して承認を実装する方法がわかりません。また、redisデータベースに書き込む方法もわかりません。これに関するドキュメントは見つかりませんでした。socket.ioとexpressを使用してredisを使用せずにセッションとストアについて説明しているサイトと、 3つすべてを使用してセッションとストアについて説明しているサイトを見つけましたが、を使用していませんio.set('store', ...)

expressまた、2つの異なるストアを使用する必要があるのか​​、1つを使用するのか、1つだけを使用するのかわかりません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()ますか?それぞれに別々のものを作成しますか?使用するだけですexpresssocket.io?私が本当に望んでいるのは、クライアントを認証し(セッションを通じて行われると思います)、クライアントが接続したときにRedisデータベースを更新してもらうことです。つまり、ユーザーが私のサイトにアクセスしたときのログを保持します。これが私の2番目の問題につながります。


2番目の問題
したがって、この時点から、redisデータベースにアクセスして編集する方法がわかりません。私は最初の問題のためにこれをテストすることができませんでしたが、私はそれが次のようなものになると思います:

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

また、node.js内からredisデータベースを更新する方法に関するドキュメントも見たことがないので、それが正しい用語であるかどうかは非常に疑わしいです。redis.put()redisのWebサイトにアクセスしましたが、node.jsのコマンドが見つかりません。コマンドラインから通常のredisを使用するためのコマンドだけです。とにかく、誰かが少なくとも私を正しい方向に向けることができれば、それは素晴らしいことです。ありがとう。:)

4

1 に答える 1

3

ご覧のとおり、ExpressとSocket.IOは、セッション管理のためにRedisと独自に統合されています。これはブラックボックス統合として設計されており、セッションストアの実装は他のコードから独立しているという考え方です。独立しているため、Expressまたはsocket.ioを使用してRedisに直接アクセスすることはできません。node_redisのような通常のredisクライアントを追加する必要があります。利点は、これらすべてのredis呼び出しを自分で行うことを心配する必要がなく、代わりにexpressまたはsocket.ioのセッションストアインターフェイスを操作することです。

したがって、#1の場合、RedisStoreの新しいインスタンスを1つ渡すことができますが、これまでのように2つの新しいインスタンスを渡すことはできません。または、2番目のリンクをたどって、socket.ioにエクスプレスでリッスンさせることもできます。その場合、エクスプレスセッション管理と統合されます。そのため、この例では余分なio.set('store')呼び出しは表示されません。

おそらく冗長に思えるかもしれませんが、RedisStoreをセッション管理専用に設計された特別なクライアントと考えてみてください。RedisStoreはおそらくnode_redisのようなものに依存しているとはいえ、それにアクセスしようとしないでください。そもそも他の非セッションアイテムをredisに保存したい場合は、redisデータベースに直接アクセスするための別のライブラリを含める必要があります。

于 2012-10-05T23:34:27.917 に答える