强制 react-router 应用向服务器发送 URL 请求
Force react-router app to send URL requests to server
我正在开发一个带有 React 路由器的 React 应用程序,服务器托管 React 应用程序本身和 REST API。路由器是来自 react-router-redux 的 ConnectedRouter。据我了解,一旦您在浏览器中打开该应用程序,将不会从服务器请求对 URL 的任何更改,而是在 React 路由器中处理客户端,即使您重新加载页面或手动编写内容也是如此进入地址栏。
首次打开应用程序时,实际的 HTML、JS 和 CSS 文件是从 Web 服务器加载的,该服务器配置为仅在用户获得授权时才提供这些文件。这样,服务器可以将用户重定向到第三方身份验证站点,或者在用户通过身份验证但未获得授权时提供 401 消息。但是,当用户会话过期、他注销或他的权限更改以致他不再被授权打开该应用程序时,就会出现问题。然后,当用户在之前缓存过它的浏览器上打开该应用程序时,它似乎可以正常打开,但会出现很多错误,因为每个 API 调用现在都失败了。
为了解决这个问题,我想在 API 调用失败时告诉用户重新加载页面,以便向服务器发出获取应用程序的请求(index.html,等),以便他被重定向到第三方身份验证站点。但是,常规的浏览器重新加载 (F5) 并不能解决问题。请求被 react-router 吞没,永远不会到达服务器。 window.location.reload()也是如此。硬重新加载,即 Ctrl+F5 似乎可以解决问题,至少在 chrome 中是这样,但有些用户可能不理解。因此,我想向用户展示一个 "hard reload" 按钮,该按钮暂时告诉 react-router 产生 url 请求,以便它们可以传递给服务器并尝试获取 index.html.
所以我的问题是:我如何暂时以编程方式强制客户端应用程序允许 URL 请求正常发送到服务器,而不是在反应路由器?
或者,如果这不可能,我如何以编程方式从浏览器的内存中清除应用程序,以便强制它再次请求服务器?
编辑:
看来我认为请求被 react-router 吞没的假设是错误的。它是 create-react-app 框架中的 service worker。 Service Worker 公开了一个注销函数,解决了我的问题。
As I understand, once you have opened the app in your browser, any changes to the URL will not be requested from the server but instead handled client-side in react router, even if you reload the page or write something manually into the address bar.
这不是真的。在地址栏中手动更改(并按回车)后,您将始终首先点击服务器路由器。
很可能您的服务器,无论哪个 url 被命中,将始终呈现包含您的 React 应用程序的 index.html
。类似于此:
app.use(express.static(path.join(__dirname, 'dist')));
app.get('*', function(req, res) {
res.sendfile('./dist/index.html');
});
确保您的 API 请求与此不冲突。如果可能的话,分享一些代码,这样我们就可以检查可能出了什么问题。
我正在开发一个带有 React 路由器的 React 应用程序,服务器托管 React 应用程序本身和 REST API。路由器是来自 react-router-redux 的 ConnectedRouter。据我了解,一旦您在浏览器中打开该应用程序,将不会从服务器请求对 URL 的任何更改,而是在 React 路由器中处理客户端,即使您重新加载页面或手动编写内容也是如此进入地址栏。
首次打开应用程序时,实际的 HTML、JS 和 CSS 文件是从 Web 服务器加载的,该服务器配置为仅在用户获得授权时才提供这些文件。这样,服务器可以将用户重定向到第三方身份验证站点,或者在用户通过身份验证但未获得授权时提供 401 消息。但是,当用户会话过期、他注销或他的权限更改以致他不再被授权打开该应用程序时,就会出现问题。然后,当用户在之前缓存过它的浏览器上打开该应用程序时,它似乎可以正常打开,但会出现很多错误,因为每个 API 调用现在都失败了。
为了解决这个问题,我想在 API 调用失败时告诉用户重新加载页面,以便向服务器发出获取应用程序的请求(index.html,等),以便他被重定向到第三方身份验证站点。但是,常规的浏览器重新加载 (F5) 并不能解决问题。请求被 react-router 吞没,永远不会到达服务器。 window.location.reload()也是如此。硬重新加载,即 Ctrl+F5 似乎可以解决问题,至少在 chrome 中是这样,但有些用户可能不理解。因此,我想向用户展示一个 "hard reload" 按钮,该按钮暂时告诉 react-router 产生 url 请求,以便它们可以传递给服务器并尝试获取 index.html.
所以我的问题是:我如何暂时以编程方式强制客户端应用程序允许 URL 请求正常发送到服务器,而不是在反应路由器?
或者,如果这不可能,我如何以编程方式从浏览器的内存中清除应用程序,以便强制它再次请求服务器?
编辑: 看来我认为请求被 react-router 吞没的假设是错误的。它是 create-react-app 框架中的 service worker。 Service Worker 公开了一个注销函数,解决了我的问题。
As I understand, once you have opened the app in your browser, any changes to the URL will not be requested from the server but instead handled client-side in react router, even if you reload the page or write something manually into the address bar.
这不是真的。在地址栏中手动更改(并按回车)后,您将始终首先点击服务器路由器。
很可能您的服务器,无论哪个 url 被命中,将始终呈现包含您的 React 应用程序的 index.html
。类似于此:
app.use(express.static(path.join(__dirname, 'dist')));
app.get('*', function(req, res) {
res.sendfile('./dist/index.html');
});
确保您的 API 请求与此不冲突。如果可能的话,分享一些代码,这样我们就可以检查可能出了什么问题。