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
...
localEmitterは常にエミッタを聴いているので間違っています。だからここであなたはまだ接続しているソケットを追跡する必要があります。 –
@CharanjeetSinghありがとう、私はlocalEmitterから切断されたソケットを削除する方法はありますか? – Yifei
まずは完全な問題を教えてください –