SocketIO 服务器不向触发事件的用户发回事件
SocketIO server not emitting event back to user who triggered event
我在前端 (React) 中使用 socket.io-client,在后端 (Express) 应用程序中使用 socket.io。在我的服务器上,我创建了一个事件,当触发时应该向房间中的所有用户发送一条消息,它看起来像这样。
socket.on('connection', () => {
// OTHER SOCKET EVENT LISTENERS (join, etc.)
socket.on('my_event', async (roomId) => {
// DO SOME DATABASE STUFF
const response = ...;
socket.in(roomId).emit('my_event_response', response);
}
});
在我的客户端上看起来像这样。
// socket.ts
export const socket = io(process.env.REACT_APP_SERVER_URL || '', { withCredentials: true });
export const SocketContext = React.createContext({} as Socket);
// parent.ts
export const ParentNode: FC = () => {
const roomId = ...;
return (
<SocketContext.Provider value={socket}>
<ChildNode roomId={roomId} />
</SocketContext.Provider>
);
}
// child.ts
export const ChildNode: FC = ({ roomId }) => {
const socket = useContext(SocketContext);
useEffect(() => {
socket.on('my_event_response', () => {
console.log("USER TRIGGERED EVENT")
})
return () => {
socket.off('my_event_response')
}
}, [socket]);
const handleClick = useCallback(() => {
socket.emit('my_event', roomId)
}, [socket, roomId]);
return (
<div>
<button onClick={handleClick} />
</div>
);
}
当用户单击按钮触发事件时,服务器会正确捕获它并向所有用户发出响应,但发出原始事件的用户除外 (my_event)。我检查以确保我没有重新渲染我的组件并以某种方式错过了事件。有没有办法解决这个问题,让发出原始事件的用户也能得到响应?
使用 io.in(...).emit(...)
,因为 socket.to(...).emit(...)
会向房间内除发送者以外的所有人发送,而 io.in(...).emit(...)
会向包括发送者在内的所有人发送。
我在前端 (React) 中使用 socket.io-client,在后端 (Express) 应用程序中使用 socket.io。在我的服务器上,我创建了一个事件,当触发时应该向房间中的所有用户发送一条消息,它看起来像这样。
socket.on('connection', () => {
// OTHER SOCKET EVENT LISTENERS (join, etc.)
socket.on('my_event', async (roomId) => {
// DO SOME DATABASE STUFF
const response = ...;
socket.in(roomId).emit('my_event_response', response);
}
});
在我的客户端上看起来像这样。
// socket.ts
export const socket = io(process.env.REACT_APP_SERVER_URL || '', { withCredentials: true });
export const SocketContext = React.createContext({} as Socket);
// parent.ts
export const ParentNode: FC = () => {
const roomId = ...;
return (
<SocketContext.Provider value={socket}>
<ChildNode roomId={roomId} />
</SocketContext.Provider>
);
}
// child.ts
export const ChildNode: FC = ({ roomId }) => {
const socket = useContext(SocketContext);
useEffect(() => {
socket.on('my_event_response', () => {
console.log("USER TRIGGERED EVENT")
})
return () => {
socket.off('my_event_response')
}
}, [socket]);
const handleClick = useCallback(() => {
socket.emit('my_event', roomId)
}, [socket, roomId]);
return (
<div>
<button onClick={handleClick} />
</div>
);
}
当用户单击按钮触发事件时,服务器会正确捕获它并向所有用户发出响应,但发出原始事件的用户除外 (my_event)。我检查以确保我没有重新渲染我的组件并以某种方式错过了事件。有没有办法解决这个问题,让发出原始事件的用户也能得到响应?
使用 io.in(...).emit(...)
,因为 socket.to(...).emit(...)
会向房间内除发送者以外的所有人发送,而 io.in(...).emit(...)
会向包括发送者在内的所有人发送。