首页 > 解决方案 > 为什么 socket 发射工作但 io.in 发射不工作?

问题描述

我正在开发一个聊天应用程序。客户端将消息发送chatId到服务器,服务器加入房间并将当前消息发送回客户端。当用户发送一条新消息时,它应该被保存并发送到组。除了向组发送消息外,一切都按预期工作。如果我评论io.in emit和取消评论socket.emit然后,如预期的那样,连接的套接字会收到消息。为什么组不发出工作?套接字可以在多个组中吗?

socket.on('joinChat', async (chatId) => {
    try {
      const chat = await Chat.findById(chatId).populate({
        path: 'messages',
        populate: {path: 'author'}
      }).limit(50);
      if (chat) {
        socket.join(chat._id);
        socket.emit('allMessages', chat.messages);
      };
    } catch(err) {
      console.log(err);
    };
  });

socket.on('submitNewMessage', async (data) => {
    try {
      let message = await Message.create({
        content: data.content,
    author: socket.user._id
      });
      if (message) {
        let chat = await Chat.findById(data.chatId);
        chat.messages.push(message._id);
    await chat.save();
    console.log('sending message to chat channel', chat._id);
    io.in(chat._id).emit('newMessage', message);
    // socket.emit('newMessage', message)
      };
    } catch(err) {};
  });

反应客户端

export default function ChatPage(props) {
  
  const {socket} = useSelector((state) => state.socket);
  const [messages, setMessages] = useState([]);
  const [message, setMessage] = useState('');
  const [chatId, setChatId] = useState(null);
  const [userId, setUserId] = useState(null);
  const classes = useStyles();

  function handleSubmit(event) {
    event.preventDefault();
    if (socket && chatId) {
      socket.emit('submitNewMessage', ({content: message, chatId: chatId}));
      setMessage('');
    };
  };

  useEffect(async () => {
    let res = await api.getChatId({friendId: props.match.params.userId});
    if (res.status === 200 && res.data.chatId) {
      setChatId(res.data.chatId);
      setUserId(res.data.userId);
    };
  },[]);

  useEffect(() => {
    if (chatId && socket) {
      socket.emit('joinChat', chatId);
      socket.on('allMessages', (allMessages) => {
        setMessages([...allMessages]);
      });
      socket.on('newMessage', (newMessage) => {
        console.log('received message!');
        setMessages((prev) => [...prev, newMessage])
      });
    };
  }, [chatId, socket]);

  return (
    ...
  )

标签: node.jsexpresssocket.io

解决方案


推荐阅读