Динамически создавайте чаты в socket.io - PullRequest
0 голосов
/ 13 января 2020

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

Материал работает отлично и быстро. Но как только в систему входит больше людей - все видят все сообщения, и рендеринг становится беспорядочным.

Я отправляю уникальный идентификатор с каждым сообщением, и я хотел бы создать комнаты, в которых люди могли бы общаться друг с другом (1 на 1)

Это происходит первым:


  const socketMessage = {
    type: type,
    body: body,
    author: author,
    date: Date.now(),
    id: chatId
  };

    const io = require('socket.io-client');
    const socket = io(process.env.REACT_APP_WS_URL);
    socket.emit('message-sent', socketMessage);

Это происходит на сервере, где это происходит:

  socket.on('message-sent', data => {
    socket.broadcast.emit('new-chat-message', data);
  });

, который затем входит в пользовательский хук и добавляет к массиву сообщений.

export default function useGetChatMessages(_id) {
  const [chatMessages, setChatMessages] = React.useState([]);

  React.useEffect(() => {
    const io = require('socket.io-client');
    const socket = io(process.env.REACT_APP_WS_URL);
    socket.emit('send-chat-id', _id);
    socket.on('chat-messages', data => {
      setChatMessages(data.messages);
    });
    socket.on('new-chat-message', message => {
      setChatMessages(messages => [...messages, message]);
      notification.play();
    });
  }, [_id]);

  return chatMessages;
}

Я знаю, что часть вещания на моем сервере неверна, но я перепробовал много вещей:

Отправка сообщения chatId с сообщением, а затем выполните socket.join(chatId) на нескольких этапах. Затем socket.to (chatId) .emit (...) и так далее. Но я не могу понять это правильно.

Может кто-нибудь помочь?

Заранее большое спасибо !! :-)

1 Ответ

1 голос
/ 14 января 2020

На самом деле, вы можете использовать функцию сокета io, называемую пространства имен.

Посмотрите довольно простой пример:

На стороне клиента вы бы сделали что-то вроде этого:

const socket = io.connect(socket_url, { query: "chatRoomId=123&userId=983912" });

А на стороне сервера что-то вроде этого:

io.on('connection', (socket) => {
  const chatRoomId = socket.handshake.query['chatRoomId'];      
  const userId  = socket.handshake.query['userId'];

  const user = find(userId) // Pretend :)

  socket.join(chatRoomId);

  socket.on('new_message', (id, msg) => {
    io.to(chatRoomId).emit(`${user.name} says ${msg}`);
  });

  socket.on('disconnect', () => {
    socket.leave(chatRoomId)
    console.log('user disconnected');
  });

});
...