NodeJS Socket io换房后发送重复消息

vcirk6k6  于 2023-03-08  发布在  Node.js
关注(0)|答案(1)|浏览(108)

enter image description here我正在构建一个slack类型的应用程序,其中有多个聊天室。但如果点击一个房间并发送消息,它工作正常,但之后,如果转到另一个频道并发送消息,我的消息得到发送2次,并在切换3次后再次发送,以此类推(如图所示)

    • 这是密码**

选择通道客户端

const selectRoomHandler = (user) => {
  socket.emit("join__room", {
      room: user.userName,
  });
};

服务器

socket.on("join__room", ({ room }) => {
    socket.leave(currRoom);
    socket.join(room);
    currRoom = room;
});

向通道客户端发送消息

socket.emit("room__message", {
  text: message,
  sender: userName,
  senderId: socket.id,
  room: selectUser.userName,
});

服务器

socket.on("room__message", ({ text, sender, senderId, room }) => {
   io.in(room).emit("room__message__incoming", {
     text,
     sender,
     senderId,
     room,
     date: new Date(),
    });
});

在客户端接收消息

useEffect(() => {
    socket.on("room__message__incoming", (data) => {
      if (data.senderId !== socket.id)
        setRoomMessage((prev) => [...prev, data]);
    });
  }, [socket]);

消息应仅出现一次,不得重复

hwamh0ep

hwamh0ep1#

使用www.example.com提供的房间socket.io可能会很棘手。就我个人而言,当我使用房间进行更多操作时,我喜欢自己管理房间状态。

export interface ClientRooms {
    [clientId: string]: string //* roomName
}

const clientRooms = {} as ClientRooms;

//in the connection:
clientRooms[client.id] = roomName; //roomName is a random string
io.sockets.to(roomName).emit('my_emmit', 'data ...')

然后,您只需更改该对象的roomName以切换房间并发送到该房间。

clientRooms[client.id] = otherRoomName;
io.sockets.to/*or sockets.in to send response to the joining client*/(otherRoomName).emit('my_emmit', 'data ...')

像这样,你可以添加和删除客户的房间,你希望。我希望你觉得这个答案有帮助。

相关问题