socket.io может присоединиться к комнате, но не может покинуть комнату - PullRequest
0 голосов
/ 21 апреля 2020

Я создаю базовый c сервис чата с использованием express и socket.io, и у меня возникла проблема, когда я могу присоединиться, но не могу покинуть комнату.

io.on('connection', (client) => {
  client.on('login', (msg) => {
    room_name = 'room'+msg.id

    console.log('login', room_name);

    var room = io.nsps['/'].adapter.rooms[room_name];
    var numClients = room ? room.length : 0;
    console.log('number of clients', numClients);

    client.join(room_name)
  });

  client.on('logout', (msg) => {
    room_name = 'room'+msg.id
    console.log('logout', room_name)

    var room = io.nsps['/'].adapter.rooms[room_name];

    client.leave(room_name, function(err) {
      var room_t = io.nsps['/'].adapter.rooms[room_name];
      if (room_t) {
        console.log("after leaving - room", room_t)
      }
    });
  });
});

Из внешнего интерфейса я знаю, что испускаемые сокеты передаются правильно, потому что я получаю оба оператора логина консоли 'login' и 'logout'. Однако в client.on('logout') я, похоже, не правильно покидаю комнату. Всякий раз, когда я смотрю в операторах журнала консоли количество клиентов в комнате, оно никогда не уменьшается, как я и ожидал после ухода. Далее, после проверки оператора console.log("after leaving - room", room_t), room_t содержит всю старую информацию о комнате (показывая, что клиент фактически НЕ покинул комнату). Я получаю те же результаты, если я делаю client.leave(room) и client.leave(room_name). (Я убедился, что имена комнат одинаковы как для входа, так и для выхода из системы)

Интересно то, что я могу покинуть комнату сразу после присоединения. Например, в client.on(login), если я присоединяюсь к комнате, то немедленно покидаю комнату, тогда у меня нет никаких проблем с этим. Не уверен, что там происходит.

Заранее спасибо!

Версии:

  • Python 3.7.6
  • узел v13. 12.0
  • express 4.17.1
  • гнездо. io@2.3.0

1 Ответ

0 голосов
/ 21 апреля 2020

Проблема здесь в том, что это ошибка старше 8 лет, которую socket.io никогда не пытался исправить.

Вы можете увидеть это здесь как git проблему: https://github.com/socketio/socket.io/issues/463

Клиент фактически отключен.

Для проверки клиента вы должны использовать следующий метод:

//Put this under the io.on('connection' ....

io.clients((error, clients) => {

  if (error) throw error;

  console.log(clients); 

// => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB]
//It should give you an array of connected client with thier socket.id

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...