Как я могу гарантировать, что клиенты могут присоединиться только к одной комнате с socket.io ?

#node.js #socket.io #chatroom

#node.js #socket.io #чат

Вопрос:

Я включаю некоторые функции обмена сообщениями в реальном времени в моем приложении с помощью сокета.ввод-вывод и необходимость обеспечения того, чтобы клиенты могли существовать только в одной комнате одновременно. Я вызываю функцию, когда пользователь закрывает область чата, которая отправляет запрос на сервер, на котором я использую сокет.оставьте, чтобы удалить клиента из комнаты. Однако, когда я затем присоединяюсь к другой комнате, клиент также присоединяется к предыдущей комнате и может отправлять сообщения только в предыдущую комнату. Надеюсь, следующий код поможет продемонстрировать, чего именно я пытаюсь достичь и как я собираюсь это сделать.

Клиент

Пользователь присоединяется к комнате, нажав на значок в своем списке друзей. Это передает уникальный идентификатор чата следующей функции joinRoom.

 var joinRoom = function(id) {
    var room = id;
    socket.emit('join', {room: room});
};
  

Когда пользователь закрывает область чата, он вызывает следующую функцию leaveRoom с тем же идентификатором.

 var leaveRoom = function(id) {
    var room = id;
    socket.emit('leave', {room: room});
};
  

Сервер

На стороне сервера у меня есть следующее.

 socket.on('join', function(data) {
    socket.join(data.room);
    rooms[userId] = data.room;
    console.log(rooms);

socket.on('leave', function(data) {
    socket.leave(data.room);
    delete rooms[userId];
    console.log(rooms);
  

Из приведенного выше видно, что я также добавляю идентификатор сеанса и идентификатор комнаты / чата к rooms объекту, когда пользователь присоединяется, и удаляю его, когда они уходят (консоль регистрируется, как и ожидалось).

Я также использовал io.sockets.client() для отслеживания комнат, и я получаю результат ниже, если пользователь 1 и пользователь 2 присоединяются к комнате, затем пользователь 1 покидает эту комнату и присоединяется к комнате с пользователем 3.

'580119d779dfb394926ffad2':
Room {
sockets:
{ '/#7GkyyIz7eINlls_1AAAD': true,
'/#fIefLQfX-VPNp9HFAAAC': true },
length: 2 },
'58011b4679dfb394926ffad3':
Room {
sockets:
{ '/#7GkyyIz7eINlls_1AAAD': true,
'/#QTxr85JsDbbgfUSdAAAE': true },
length: 2 } }

Вышесказанное говорит мне, что пользователь 1 оказывается в двух комнатах, что говорит о том, что они не полностью покидают первую.

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

Комментарии:

1. Это кажется неправильным delete rooms[userId] == data.room; , оно просто сравнивает rooms[userId] == data.room; это, а затем пытается удалить его delete true или delete false на основе значения. На самом деле это не удаление элемента. Чтобы удалить элемент, он должен быть просто delete rooms[userId]

2.Спасибо, у меня изначально было так, delete rooms[userId] поэтому я изменю его обратно. Это только изменяет мой rooms объект, хотя это не имеет ничего общего с тем, что клиент покидает socket.io room .