2012-07-23 10 views
14

A Redis típicos, como charla será algo parecido a esto (ver https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js por sólo un ejemplo de ello):Cómo eliminar Redis en los oyentes 'mensaje'

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(); 
    }); 
}); 

Sin embargo, el problema aquí es que cuando un client ' desconectar ', el oyente redis1.on('message',FUNC(){}) aún está conectado. La consola continuará imprimiendo el message. Si uno fuera a inspeccionar los listados de eventos de redis1, todavía encontrarían la función anónima escuchando.

El problema es que no hay función redis1.off(...). Entonces, ¿cómo se desenlaza/desuscribe/elimina/elimina el oyente de mensajes redis?

Nota: No se puede hacer simplemente redis1.end(), ya que eso romperá la conexión redis para otros usuarios conectados a la websocket.

Respuesta

21

La única solución que he encontrado jugando en el nodo REPL es no usar la función redis.on() para suscribirme. En cambio, uno debe usar las funciones redis.addListener() y redis.removeListener(). Además, no se deben usar funciones anónimas como devoluciones de eventos. Se podría hacer algo como esto:

var callback = function(channel, message){ 

}; 

redis1.addListener('message', callback); 

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

El cliente Redis es un [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter), que tiene un método 'on' que es justo un alias para 'addListener', y' removeListener', que es lo contrario. Entonces puedes seguir usando 'on', mientras usas' removeListener'. –

+13

Para alguien como yo que solo ha rozado esto y se ha perdido el punto: removeListener realmente está eliminando la FUNCIÓN, no solo eliminando esa unión .. I.E. 'removeListener ('message', callback)' está eliminando la función 'callback' del enlace 'mensaje'. Es decir, si está utilizando una función anónima 'redis1.addListener ('message', function (c, m) {..}', entonces no tiene forma de eliminar el oyente y redis continuará publicando en los sockets – TheRightChoyce

+0

@ Thechoyce ¡Tu comentario me da más información que la respuesta! – laike9m

Cuestiones relacionadas