每次刷新都会为socket.io连接添加另一个侦听器

时间:2017-04-04 13:24:22

标签: javascript node.js socket.io real-time

我有一个设置,服务器监听客户端,然后发送实时通知。服务器代码如下所示:

var io = require('socket.io').listen(8888);

io.sockets.on('connection', function (socket) {
	socket.emit('connected', { connected: true });
	console.log("New user " + socket.id);
  
  	socket.on('ready for data', function (data) {
	 pg_client.on('notification', function(content) {
          socket.broadcast.to('ROOM').emit('update', content)
    });
  });
});
			

每当来自数据库的通知进入时,ROOM中的所有客户端都会收到消息。这有效,但如果客户端刷新其页面,他们现在正在侦听两次,并为每次更新获得两个通知。 socket.id已被添加,但永远不会消失。这是客户端代码:

var socket = require('socket.io-client')('http://IP:8888')
socket.on('connected', function (data) {
	socket.emit('ready for data', {});
});

// Triggered by an addChannel function
socket.emit('add room', {room: 'ROOM'})

socket.on('update', function(data) {
  // This gets hit multiple times per update, depending on the number of client refreshes 
})

我尝试在客户端和服务器端替换once on,但没有运气。这导致仅第一次更新通过,而没有其他

1 个答案:

答案 0 :(得分:1)

看起来每次新套接字连接时,您都要为此创建一个新的事件处理程序:

pg_client.on('notification', ...)

因此,每当新页面连接时,这些事件处理程序将累积。这可以解释您在页面刷新时看到的行为,因为每次刷新都与新页面连接相同。该事件处理程序应该只在服务器初始化时注册一次,而不是每次新的套接字连接时。您可以将它移出套接字连接处理程序,如下所示:

var io = require('socket.io').listen(8888);

io.sockets.on('connection', function (socket) {
    socket.emit('connected', { connected: true });
    console.log("New user " + socket.id);

    socket.on('ready for data', function (data) {
  });
});


pg_client.on('notification', function(content) {
    io.to('ROOM').emit('update', content)
});