2017-09-11 13 views
0

Ich versuche, Nachricht von Redis Pubsub an Socket-Client mithilfe von Nodejs EventEmitter weiterzuleiten.socket.io-Verbindung besteht nach dem Trennen weiterhin

var events = require('events'); 
    var subscriber = redis.createClient(); 

    var app = express(); 

    var localEmitter = new events.EventEmitter(); 


    var server = require('http').createServer(app); 

    var io = require("socket.io")(server, {secure: 'true'}); 

    io.on('connection', function (socket) { 
    localEmitter.on('FORWARDING', function(message)) { 
     console.log(socket.id + ': localEmitter is forwarding messages'); 
    } 

    socket.on('disconnect', function(){ 
     console.log(socket.id + ' disconnected); 
    }) 
    }; 


    subscriber.on('message', function (channel, message) { 

     console.log("Got message from redis"); 
     localEmitter.emit('FORWARDING', encoded); 
    }); 

Aber wenn ich die Webseite, die websocket Verbindung trennt und verbindet aktualisieren, kann das disconnect Verfahren ausgelöst werden, aber die localEmitter noch Nachrichten über die alte Socket-ID weiterzuleiten.

Die Protokolle wie folgt aussehen:

pxw8pcocxI3O2ru3AAAA: localEmitter is forwarding message 
0BX2bVYoAn2g2JtMAAAB: localEmitter is forwarding message 
0BX2bVYoAn2g2JtMAAAB disconnected 
pxw8pcocxI3O2ru3AAAA: localEmitter is forwarding message 
0BX2bVYoAn2g2JtMAAAB: localEmitter is forwarding message 
... 
+0

Sie tun es falsch, weil localEmitter immer auf den Emitter hört. Hier müssen Sie also die Anschlüsse verfolgen, die noch verbunden sind. –

+0

@CharanjeetSingh Danke, gibt es eine Möglichkeit, die getrennten Sockets von localEmitter zu entfernen? – Yifei

+0

Zuerst Bitte teilen Sie Ihr komplettes Problem –

Antwort

0

Entfernen Ereignis-Emitter, wenn Buchse

io.on('connection', function(socket) { 

    localEmitter.on('FORWARDING', mymessage); 

    function mymessage(message) { 
    console.log(socket.id + ': localEmitter is forwarding messages'); 
    } 

    socket.on('disconnect', function() { 
    localEmitter.removeListener('FORWARDING', mymessage); 
    console.log(socket.id + ' disconnected'); 
    }); 

}); 

trennt Sie können auch das Konzept der Raum für die gleiche verwenden.

+0

Das Problem mit dem obigen Code ist, dass es Listener für alle Sockets entfernt. nicht nur für eine Socket-ID. –

+0

An meinem Ende funktioniert es gut, nur den bestimmten Sockel zu entfernen. –

Verwandte Themen