首页 > 解决方案 > 带有房间的 Socket IO 私人消息不起作用

问题描述

我正在做一个 Tinder Web 应用程序,我想实现实时聊天。我将 ReactJS 用于客户端,将 Nodejs 用于服务器,我为聊天应用程序添加了 Socket.IO。

当 2 个配置文件相互匹配时,他们可以一起交谈,所以当他们匹配时,我为他们创建一个房间,并使用从他们的 user_id 创建的唯一 ID。所以让我们想象一下:

user_id 90 与 user_id 50 匹配 generateRoomid(90, 50) 创建。

服务器端有 3 个事件,connection 事件,create_room 事件,chat-message 事件。

 io.on("connection", (socket) => {
  socket.on("user_connected", (user_id) => {

  /* when they log in I store socket.id but it change every time so I will delete it */

   addUser({socket_id: socket.id, user_id: user_id})
  })

  socket.on("create_room", (data, cookie) => {
   let decode = jwt.verify(cookie, process.env.JWT_SECRET)
   let user_id = decode.id
   let total_match_id = data.map(a => a.id);

   /* when user log I catch all match he has and create room for each match */

   total_match_id.forEach((id) => {
     let room_id = GenerateRoom(user_id, id)
     socket.join(room_id)
    })

 })

 socket.on("chat-message", ({ message, user_send, user_receive }) => {
   var fullDate = getFullDate();
   let room_id = GenerateRoom(user_send, user_receive)
   io.to(room_id).emit("chat-message", { user_send, user_receive, message, fullDate })
   insertMessage(user_send, user_receive, message, fullDate)
 })
});

客户端我做了两件事,一个发送/发送消息的表单,以及一个等待响应显示它的缺陷:

  /* useEffect */

  const socketMessage = async () => {
  socket.on("chat-message", (data) => {
    setAllMessage(allMessage => [...allMessage, data.message ]);
  });
  socketMessage(
  
  //
  
 /* onSubmit */
const sendMessage = (e) => {
  e.preventDefault();
  const user_send = user.id
  const user_receive = userChat.id
  if (message !== "" && message != null) {
   socket.emit("chat-message", { user_send, message, user_receive });
   setMessage("");
  }
}

在我想使用socket.id之前,但事情是每个页面的socket.id都发生了变化,我知道这很正常但我无法存储它,所以在阅读了Socket.io doc之后,房间对我来说是最好的选择,我遵循文档,但它不起作用,当我向所有客户端(io.emit)发出时它起作用,但是当我尝试在房间上发出时它不起作用。

任何想法?我做错了什么?

标签: node.jsreactjssocketssocket.ioreact-hooks

解决方案


推荐阅读