2017-09-11 15 views
0

nodejs EventEmitterを使用して、Redis pubsubからsocketioクライアントにメッセージを転送しようとしています。切断後にsocket.io接続がまだ存在する

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

しかし、私は、Webページ、WebSocketの接続が切断と再接続を更新した場合、disconnect方法をトリガすることができますが、localEmitterはまだ古いソケットIDを経由してメッセージを転送します。

ログは次のようになります。ソケットは、あなたも同じのために部屋の概念を使用することができます

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

}); 

を切断したときにイベント・エミッターを削除

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

localEmitterは常にエミッタを聴いているので間違っています。だからここであなたはまだ接続しているソケットを追跡する必要があります。 –

+0

@CharanjeetSinghありがとう、私はlocalEmitterから切断されたソケットを削除する方法はありますか? – Yifei

+0

まずは完全な問題を教えてください –

答えて

0

+0

上記のコードの問題は、すべてのソケットのリスナーが削除されていることです。 1つのソケットIDだけでなく、 –

+0

私の最終的には、特定のソケットだけを取り外してうまく動作しています。 –