#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
.