我正在尝试使用nodejs EventEmitter将消息从Redis pubsub转发到socketio客户端。
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);
});
但是如果我刷新网页,websocket连接断开连接并重新连接,可以触发disconnect
方法,但localEmitter
仍然通过旧套接字ID转发消息。
日志看起来像:
pxw8pcocxI3O2ru3AAAA: localEmitter is forwarding message
0BX2bVYoAn2g2JtMAAAB: localEmitter is forwarding message
0BX2bVYoAn2g2JtMAAAB disconnected
pxw8pcocxI3O2ru3AAAA: localEmitter is forwarding message
0BX2bVYoAn2g2JtMAAAB: localEmitter is forwarding message
...
答案 0 :(得分:0)
套接字断开连接时删除事件发射器
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');
});
});
您也可以使用相同的房间概念。