Node.js не отправляет сокет на событие разъединения

Когда кто-то подключается к серверу node, я сохраняю массив со всеми сокетами. Таким образом, я могу передавать сообщения всем пользователям, когда это необходимо, или перебирать пользователей, чтобы подсчитывать количество онлайн-пользователей и т.д.

Все это прекрасно работает, но когда происходит событие on disconnect, я не получаю сокет в своих аргументах. Есть ли другой способ узнать, какой сокет просто отключен?

var allClients = [];

io.sockets.on('connection', function(socket) {
   allClients.push(socket);

   socket.on('disconnect', function(socket) {
      console.log('Got disconnect!');

      var i = allClients.indexOf(socket);
      delete allClients[i];
   });
});

Конечно, приведенный выше пример не работает, поскольку событие disconnect не дает аргумент сокета (или любой другой аргумент). Итак, есть ли еще одно событие, которое срабатывало перед отключением, где сокет все еще существует?

Али

Ответ 1

У вас уже есть сокет, потому что обработчик разъединения объявлен в области событий "соединение". Попробуйте удалить параметр, который вы передаете обработчику "disconnect", вы должны иметь возможность работать с параметром socket из обработчика соединения.

io.sockets.on('connection', function(socket) {
   allClients.push(socket);

   socket.on('disconnect', function() {
      console.log('Got disconnect!');

      var i = allClients.indexOf(socket);
      delete allClients[i];
   });
});

Кроме того, вам не нужен массив сокетов для трансляции, вы можете использовать комнаты для группировки сокетов и трансляции во все сокеты внутри этой комнаты.