sock.io io.to(sockid) 在 Express+ React 中不起作用

sock.io io.to(sockid) didn't work in Express+ React

我尝试建立一个实时聊天室,但有问题,这是我的代码

const addUser = (userId:string,socketId:string)=>{
        !users.some(user=>user.userId===userId) &&
            users.push({userId,socketId});
    }
const removeUser = (socketId:string)=>{
        users = users.filter(user=>user.socketId !== socketId)
    }
const getUser = (userId:string)=>{
        return users.find(user=>user.userId === userId)
    }
io.on("connection",(socket)=>{
        //when connect
        console.log(users)
        io.emit("getMessage",{
          message:"good"
        })
        //take userId and socketId from user
        socket.on("addUser",userId=>{
            addUser(userId,socket.id);
            console.log(users)
            io.emit("getUsers",users)
        })
        //send and get message
        socket.on("sendMessage",({ senderId,receiverId,text})=>{
            const user = getUser(receiverId); //use receiverId to find it's socketId
            console.log(users)
            console.log(user.socketId)
            io.to(user.socketId).emit("getMessage",{ //did'nt work
              senderId,
              text, 
            });
            // io.emit("getMessage",{   //it works
            //   senderId,
            //   text, 
            // })
        })
        //when disconnect
        socket.on("disconnect",()=>{
            console.log("a user disconnected")
            removeUser(socket.id);
            io.emit("getUsers",users)
        })
    })

客户端

const socket = useRef();
useEffect(()=>{
        const getOnline = async()=>{
            socket.current = await io(process.env.REACT_APP_SOCKET_PORT)   
            socket.current.on("getMessage",data=>{
                console.log("Message",data)
                setArrivalMessage({
                    sender: data.senderId,
                    text: data.text,
                    createdAt: Date.now(),
                })
            })
        }
        getOnline();     
    },[])
const handleSubmit = async(e)=>{
        e.preventDefault();
        console.log(socket.current.id)
        const message = {
            sender: user._id,
            text: newMessage.current.value,
            conversationId : currentChat._id,
        };
        const receiverId = currentChat.members.find(
            (member)=> member !== user._id
        );

        socket.current.emit("sendMessage",{
            senderId: user._id,
            receiverId,
            text:newMessage.current.value,
        })
        console.log(user._id)
        console.log(receiverId)
        //database insertion......
    };

所以除了发送消息之外一切正常,当我厌倦了向特定的套接字 ID 发送消息时,它不会工作,所以我尝试发出发送给每个人,它工作,然后我认为它可能是套接字id问题,所以我在两边打印了下面的socket id。

服务器端控制台

611dc227ccbf0ca9d2193b37 Hi 611de1937df523af1ffd42f8 
[ // people who connect to this socket ,you can see the logic above
  { 
    userId: '611dc227ccbf0ca9d2193b37',
    socketId: 'R0aR7RPkiaH-Ai8qAAAR'
  },
  {
    userId: '611de1937df523af1ffd42f8',
    socketId: 'J-J30EWlhVeDkqJ6AAAd'
  }
]
J-J30EWlhVeDkqJ6AAAd //this is receiver's socket id in server 

客户端控制台

R0aR7RPkiaH-Ai8qAAAR //client socket id
611dc227ccbf0ca9d2193b37 // both side unique userId
611de1937df523af1ffd42f8

所以这真的很奇怪,考虑到两个套接字 ID 都是正确的,但我仍然无法通过 io.to(socketId) 接收消息。我已经处理这些几个小时了,请帮忙

调试了一段时间后,我设法解决了这个问题,希望这可以帮助其他正在纠结于此的人。

所以我不小心连接了两次套接字。

socket.current = await io(process.env.REACT_APP_SOCKET_PORT)   

根据我的测试,我认为它只会连接一次,之后即使你可以成功传递你的消息,socketId 将固定在原来的那个上,但服务器将包含你的最后一个 socketId。

这就是为什么我没有使用io.to(socketId),并且因为我把另一个连接命令留在了其他功能上,所以我认为没有人可以回答这个问题。无论如何谢谢!