2012-07-23 4 views
14

Ein typisches Redis Beispiel so etwas wie dies gehen Chat zu entfernen (siehe https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js nur ein solches Beispiel für):Wie Redis auf ‚message‘ Zuhörer

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

jedoch hier das Problem ist, dass, wenn ein client ' disconnect ', der redis1.on('message',FUNC(){}) Listener ist immer noch angeschlossen. Die Konsole wird weiterhin message ausdrucken. Wenn man die Ereignislistener von redis1 inspizieren würde, würden sie immer noch die anonyme Funktion hören.

Das Problem ist, dass es keine redis1.off(...) Funktion gibt. Also, wie kann man den Redis Message Listener lösen/entfernen/entfernen/entfernen?

Hinweis: Man kann redis1.end() nicht einfach tun, da dies die Redis-Verbindung für andere Websocket-Benutzer unterbrechen wird.

Antwort

21

Die einzige Lösung, die ich gefunden habe, indem Sie im Knoten REPL herumspielen, ist, die redis.on() Funktion zu verwenden, um sich zu abonnieren. Stattdessen sollte man die Funktionen redis.addListener() und redis.removeListener() verwenden. Außerdem darf man keine anonymen Funktionen als Ereignisrückrufe verwenden. Man könnte so etwas tun:

var callback = function(channel, message){ 

}; 

redis1.addListener('message', callback); 

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

Der redis Client eine ist [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter), die eine 'on' Methode hat, die nur ein Alias ​​für 'addListener' und' removeListener', das ist das Gegenteil. Sie können 'on' also weiter verwenden, während Sie' removeListener' verwenden. –

+13

Für jeden wie mich, der dies nur überflogen hat und den Punkt verfehlt hat: Der removeListener entfernt tatsächlich die FUNKTION, nicht nur das Löschen der Bindung .. I.E. 'removeListener ('message', callback)' entfernt die 'callback' Funktion von der 'message' Bindung. Wenn Sie eine anonyme Funktion 'redis1.addListener ('Nachricht', Funktion (c, m) {..} ') verwenden, haben Sie keine Möglichkeit, den Listener zu entfernen, und redis wird weiterhin in leeren Sockets publizieren. – TheRightChoyce

+0

@ Thechoyce Dein Kommentar gibt mir mehr Informationen als die Antwort! – laike9m