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),并且因为我把另一个连接命令留在了其他功能上,所以我认为没有人可以回答这个问题。无论如何谢谢!
我尝试建立一个实时聊天室,但有问题,这是我的代码
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),并且因为我把另一个连接命令留在了其他功能上,所以我认为没有人可以回答这个问题。无论如何谢谢!