17

典型的な Redis チャットの例は次のようになります (そのような例の 1 つだけについては、 https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.jsを参照してください)。

io.sockets.on('connection', function (client) { //websocket connection

  redis1.subscribe("chat");

  redis1.on("message", function(channel, message) {
      console.log(message);
      client.send(message);
  });

  client.on('message', function(msg) {
    redis2.publish("chat",msg.message);  
  });

  client.on('disconnect', function() {
      redis1.quit();
  });
});

ただし、ここでの問題は、client「切断」してもredis1.on('message',FUNC(){})リスナーがまだアタッチされていることです。コンソールは引き続きmessage. のイベント リスナをredis1調べると、無名関数がリッスンしていることがわかります。

問題は、機能がないredis1.off(...)ことです。では、どのように redis メッセージ リスナーをアンバインド/サブスクライブ解除/削除/削除するのでしょうか?

注: redis1.end() だけを実行することはできません。これは、他の websocket 接続ユーザーの redis 接続を切断するためです。

4

1 に答える 1

27

ノード REPL をいじって見つけた唯一の解決策は、redis.on()関数を使用してサブスクライブしないことです。代わりにredis.addListener()andredis.removeListener()関数を使用する必要があります。さらに、無名関数をイベント コールバックとして使用してはなりません。次のようなことができます。

var callback = function(channel, message){

};

redis1.addListener('message', callback);

client.on('disconnect', function(){
  redis1.removeListener('message', callback);    
})
于 2012-07-23T17:53:50.117 に答える