2012-07-23 6 views
14

Un tipico Redis Chat esempio andrà qualcosa di simile (vedi https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js per solo un esempio):Come rimuovere Redis sugli ascoltatori 'messaggio'

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

Tuttavia, il problema qui è che quando un client ' disconnect ', il listener redis1.on('message',FUNC(){}) è ancora collegato. La console continuerà a stampare il numero message. Se si dovessero ispezionare i listener di eventi di redis1, troverebbero comunque la funzione anonima in ascolto.

Il problema è che non esiste la funzione redis1.off(...). Quindi, come si fa a non vincolare/annullare l'iscrizione/eliminare/rimuovere l'ascoltatore del messaggio redis?

Nota: non è possibile eseguire semplicemente redis1.end(), poiché ciò interromperà la connessione redis per altri utenti connessi a Websocket.

risposta

21

L'unica soluzione che ho trovato giocando nel nodo REPL è di non utilizzare la funzione redis.on() per iscriversi. Invece, si dovrebbero usare le funzioni redis.addListener() e redis.removeListener(). Inoltre, non è necessario utilizzare le funzioni anonime come callback di eventi. si potrebbe fare qualcosa di simile:

var callback = function(channel, message){ 

}; 

redis1.addListener('message', callback); 

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

Il cliente Redis è un [EventEmitter] (http://nodejs.org/api/events.html#events_class_events_eventemitter), che ha un metodo 'on' che è solo un alias per 'addListener' e' removeListener', che è il contrario. Quindi puoi continuare a usare 'on', mentre usi ancora' removeListener'. –

+13

Per chi come me ha appena sfiorato questo e perso il punto: il removeListener sta effettivamente rimuovendo la FUNZIONE, non solo cancellando quella rilegatura .. I.E. 'removeListener ('message', callback)' sta rimuovendo la funzione 'callback' dal binding 'message'. Significato se stai usando una funzione anonima 'redis1.addListener ('messaggio', funzione (c, m) {..}', allora non hai modo di rimuovere l'ascoltatore e i redis continueranno a pubblicare nelle prese morte – TheRightChoyce

+0

@ Thechoyce Il tuo commento mi dà più informazioni rispetto alla risposta! – laike9m

Problemi correlati