在反应路由器中维护websocket连接

Posted

技术标签:

【中文标题】在反应路由器中维护websocket连接【英文标题】:Maintaining websocket connection in react router 【发布时间】:2017-02-14 09:41:53 【问题描述】:

我有一个使用 React Router 进行路由的 React/Redux 应用程序。

作为这个应用程序的一部分,我设置了一个 websocket 连接。我面临的一个问题是,当直接导航到一个 url 时,连接会断开。

例如:

    用户登陆主页www.app.com/ Websocket 连接已建立。 用户通过 React Router browserHistory 导航到www.app.com/link(此页面上没有建立任何连接的代码)。 保持连接。

这按预期工作。然而:

    用户登陆主页www.app.com/ Websocket 连接已建立。 用户通过在地址栏中输入/link 直接导航到它(或通过前面的示例导航到它后刷新页面。 连接断开。

这是预期的行为吗?如果是这样,是否有任何 Redux/React Router 模式可以避免它?每次都要手动重新建立连接吗?

【问题讨论】:

你知道服务器端路由和客户端路由吗? 到目前为止,该应用程序的计划一直是无服务器的。所以一切都是客户端,它将托管在带有 Route53 的 S3 上,以捕获对app.com/ 以外的任何内容的请求 不确定 websocket 部分,但如果您手动导航到链接,它将仅使用 React 路由器部分,它将向服务器查询该文件,如果它仅作为路由存在客户端,那么您会得到一个404,它会失败。为了解决这个问题,您需要在后端有一个捕获所有路径(例如,如果您手动键入 URL 或刷新页面,它将是 app.get('*', (req, res) => res.sendFile('index.html')); 触发。在您的情况下,仅适用于服务器端和 websocket '将需要设置它以便建立连接而不考虑特定的 React 路由(如 Tiago 所说) 是的,我知道这个问题,这就是我在之前的评论中“捕捉”请求的意思。不过感谢您的帮助! 【参考方案1】:

是的,这是预期的行为。当您刷新页面或通过键入 URL 手动导航时,浏览器将再次转到服务器以加载文件,包括您的 javascript 应用程序(它可能会从缓存中获取它,但结果是相同的)。因此,您在内存中的 javascript 代码(包括 websocket 连接)将丢失,并且所有脚本都将被再次评估。

没有办法解决这个问题。要始终打开 websocket 连接,您只需在应用入口点脚本中打开连接即可,无论用户在哪个页面。

【讨论】:

以上是关于在反应路由器中维护websocket连接的主要内容,如果未能解决你的问题,请参考以下文章

Webflux,使用Websocket如何防止订阅两次反应式redis消息操作

构造“WebSocket”失败:URL“[object Object]”无效

移动网络中 8080 或 80 端口上的 WebSocket 连接失败

在 WebSocket 控制器中获取登录用户的 Principal

WebSocket简介

websocket._exceptions.WebSocketProxyException:通过代理连接失败状态:503