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

Socket.IO搭配RxJS如何在重连前先等待HTTP请求完成获取认证票据

解决方案

Socket.IO 客户端 3.0 及以上版本原生支持将 auth 配置项设为异步函数,每次建立连接(包括首次连接和自动重连)时都会自动执行该函数获取最新的认证参数,完全匹配你的需求,无需手动监听重连事件。
修改后的代码如下:

export const notificationsWsSubject = new BehaviorSubject<Socket | null>(null)

signedInObservable.subscribe(user => {
    const socket = io(SERVER_URL, {
        // auth 配置为异步函数,每次连接/重连前自动执行
        auth: async () => {
            // 实时拉取最新票据
            const ticketRes = await getNotificationsWebsocketTicket()
            return {
                ticket: ticketRes.data,
                accessToken: user.accessToken
            }
        }
    })
    notificationsWsSubject.next(socket)
})

该方案的逻辑和你原有首连接逻辑完全对齐,同时自动覆盖了重连场景:首次连接时自动拉取票据再发起连接,重连时会再次执行异步函数拉取新票据后再重连。


备选方案(手动控制重连逻辑)

如果你需要更精细的流程控制,也可以通过监听 reconnect_attempt 事件手动更新认证参数:

export const notificationsWsSubject = new BehaviorSubject<Socket | null>(null)

signedInObservable.pipe(
    switchMap(user => forkJoin([of(user), from(getNotificationsWebsocketTicket())]))
).subscribe(values => {
    const [user, ticketRes] = values
    const socket = io(SERVER_URL, {
        auth: {
            ticket: ticketRes.data,
            accessToken: user.accessToken
        }
    })

    // 每次重连尝试前更新票据
    socket.on('reconnect_attempt', async () => {
        const newTicketRes = await getNotificationsWebsocketTicket()
        socket.auth.ticket = newTicketRes.data
    })

    notificationsWsSubject.next(socket)
})

注意事项

  • 异步 auth 函数方案要求 Socket.IO 客户端版本 >= 3.0,旧版本请使用备选方案
  • 建议在异步请求票据的逻辑中增加 try/catch 捕获异常,避免请求失败导致连接终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:45:03