Подтвердить что ты не робот

Как удалить Redis на прослушивание сообщения

Типичный пример чата Redis будет выглядеть примерно так (см. 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 'disconnect', слушатель redis1.on('message',FUNC(){}) все еще подключен. Консоль продолжит печать message. Если кто-то будет проверять участников событий redis1, они все равно найдут анонимную функцию прослушивания.

Проблема в том, что нет функции redis1.off(...). Итак, как отключить/отменить подписку/удалить/удалить прослушиватель сообщений redis?

Примечание. Нельзя просто сделать redis1.end(), так как это нарушит соединение redis для других пользователей, подключенных к сети.

4b9b3361

Ответ 1

Единственное решение, которое я нашел, играя в node REPL, - это не использовать функцию redis.on() для подписки. Вместо этого следует использовать функции redis.addListener() и redis.removeListener(). Кроме того, нельзя использовать анонимные функции как обратные вызовы событий. Можно сделать что-то вроде этого:

var callback = function(channel, message){

};

redis1.addListener('message', callback);

client.on('disconnect', function(){
  redis1.removeListener('message', callback);    
})