Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在socket.io中动态创建聊天室_Javascript_Reactjs_Socket.io_Wavesurfer.js - Fatal编程技术网

Javascript 在socket.io中动态创建聊天室

Javascript 在socket.io中动态创建聊天室,javascript,reactjs,socket.io,wavesurfer.js,Javascript,Reactjs,Socket.io,Wavesurfer.js,我正在开发一个聊天应用程序,我在socket.io上遇到了一些问题 东西工作得又快又好。但是,一旦有更多的人登录,所有人都会看到所有的消息,渲染就会变得混乱 我会为每条消息发送一个唯一的ID,我很想创建一个聊天室,人们可以在这里相互聊天(1对1) 这首先发生: const socketMessage = { type: type, body: body, author: author, date: Date.now(), id: chatId }

我正在开发一个聊天应用程序,我在socket.io上遇到了一些问题

东西工作得又快又好。但是,一旦有更多的人登录,所有人都会看到所有的消息,渲染就会变得混乱

我会为每条消息发送一个唯一的ID,我很想创建一个聊天室,人们可以在这里相互聊天(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;
}
我知道我的服务器上的广播部分出错,但我尝试了很多方法:

发送带有消息的聊天ID,然后分几个阶段执行
socket.join(聊天ID)
。 然后是socket.to(chatId).emit(…)等等。 但我不能把它弄对

有人能帮忙吗


提前多谢!!:-)

实际上,您可以使用名为名称空间的套接字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');
  });

});
在服务器端,类似这样的内容:

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');
  });

});

嘿,菲利佩。这很聪明。我现在用ID生成的房间解决了这个问题:-)我的解决方案只适用于本地开发。我可能会将此用于制作:-)非常感谢!