You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于react-use-websocket延迟WebSocket初始连接至Token就绪?

解决方案

核心思路是延迟WebSocket的初始连接,直到Redux中的Token存在后再触发,同时确保Token更新时URL能同步刷新。具体修改如下:

1. 修正URL生成函数的依赖

原代码中getSocketURL的依赖数组为空,导致accessToken更新时URL不会重新生成。需要将accessToken加入依赖数组,保证Token变化时URL能同步更新:

const accessToken = useSelector(state => state.auth.access.token);

const getSocketURL = useCallback(() => {
    if (!accessToken) return null; // Token不存在时返回null,不触发连接
    const url = new URL(`ws://${window.location.hostname}:8001/ws/commands`);
    url.searchParams.append('token', accessToken);
    console.log('URL', `${url}`);
    return `${url}`;
}, [accessToken]); // 加入accessToken作为依赖

2. 让useWebSocket仅在URL有效时连接

react-use-websocket会在第一个参数(URL)从null变为有效地址时自动触发连接。修改useWebSocket的调用,利用这一特性实现延迟初始化:

const { readyState, getWebSocket } = useWebSocket(getSocketURL(), {
    share: true,
    retryOnError: true,
    shouldReconnect: (e) => true,
    reconnectInterval: 4,
    reconnectAttempts: 2,
    onError: (e) => console.error('Error in websocket', e)
});

额外说明

  • 当Token首次获取到或后续刷新时,getSocketURL会返回新的带Token的URL,useWebSocket会自动断开旧连接(如果存在)并建立新的认证连接。
  • 如果需要更精细的控制(比如手动触发连接),可以结合useEffect监听accessToken的变化,调用getWebSocket()手动初始化,但上述方案已经能满足大部分场景需求。

内容的提问来源于stack exchange,提问作者cclloyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:50:24