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

Each refresh adds another listener to socket.io connection

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

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 但没有成功。这导致只有第一个更新通过,而没有其他更新

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

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