lavezzi1
@lavezzi1

Множество каналов/комнат одновременно на socket.io?

Здравствуйте. Разбираюсь с socket.io, пишу чат наподобие слака или дискорда. Где пользователь подключен к множеству комнат/каналов. Изучил доку и кучу туториалов, нашел много примеров с чатами но все они довольно примитивные. С помощью rooms не получается реализовать так как при подключении и join, socket.id у пользователя для всех комнат одинаковый и при emit сообщения с сервера оно попадает во все комнаты. В таком случае не совсем понятен смысл rooms.

Возможно мне надо использовать namespaces? Что я делаю не так?

UPD:
client
const rooms = [{...}, {...}];
this.socket.on('connect', () => {
   rooms.forEach((room) => {
     this.socket.emit('join', {user, room});
   });
});


server
io.on('connection', (socket) => {
  console.log('New user connected');

  // Join
  socket.on('join', ({ user, room }) => {

    socket.join(room.id);
    users.removeUser(`${user.name}_${room.id}`);
    users.addUser(`${user.name}_${room.id}`, user.name, room.id);
  });

  // Chatting
  socket.on('message', async ({user, room, message}) => {
    await db.query('INSERT INTO messages SET ?', { userId: user.id, roomId: room.id, text: message});
    socket.broadcast.to(room.id).emit('message', { room, user, text: message });
  });

  socket.on('disconnect', () => {
    users.removeUser(socket.id);
  });
});


Вот список юзеров после коннекта:
[ { id: 'Pavel_1', name: 'Pavel', room: 1 },
     { id: 'Max_1', name: 'Max', room: 1 },
     { id: 'Max_2', name: 'Max', room: 2 },
     { id: 'Pavel_2', name: 'Pavel', room: 2 } ]


При отправке сообщение от Pavel в room 2, сообщение прилетает во все комнаты. Получается, мне надо на клиенте когда я слушаю новые сообщения, проверять если это прилетело из текущей комнаты то показывать сообщение? Тогда не понятно зачем нужны rooms.
  • Вопрос задан
  • 3083 просмотра
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise
Solution Architect, AWS Certified, Serverless
А указывать в сообщении идентификатор комнаты не охота?
Ответ написан
@vshvydky
дружище, не вкурил ты доку
смотри как решать это, вешаешь
io.on('connection', function (socket) {
  socket.on('join', function (from, msg) { ожидаем с клиента emit('join', 'channame')
    socket.join(msg); // msg = channame
    socket.to(msg).emit(`client ${from} connect to chat`);
  });
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы