【问题标题】:Routes on server & client side - React.js & Node.js服务器和客户端的路由 - React.js 和 Node.js
【发布时间】:2016-09-24 12:44:06
【问题描述】:

我试图真正了解路由如何在我的 react 应用程序上与 react-router 一起工作,并在我的 node.js 服务器上表达。

反应路由器代码:

import ..
import { Router, Route, IndexRoute, hashHistory, IndexRedirect, Redirect } from "react-router";

render(
  <Router history={hashHistory}>
    <Redirect from="/" to="/index"/>
    <Route path="/" component={App}>
        <IndexRoute component={NavBarTop} />
        <IndexRoute component={NavFilter} />
        <Route path="/index" component={Tickets} />
        <Route path="/ticket/:id" component={TicketInformations} />
        <IndexRoute component={InterventionsList} />
    </Route>
  </Router>,
document.getElementById('container'));

我的服务器路由:

app.use('/', express.static(path.join(__dirname, '../client/')), function(res, eq) {
});

app.get('/test', function (req, res) {
  console.log("test");
  var data = getTickets(); // return a JSON
  res.end( data );
});

我的反应路由工作完美,但是我想进行 AJAX 调用来填充我的组件。为此,我尝试从我的节点服务器获取 JSON。但是路径“测试”不起作用。我的 console.log 没有被调用。

我不知道为什么,我可能不明白它是如何工作的。 如何轻松创建网络服务来准备我的 AJAX 调用?

【问题讨论】:

  • 对“/test”的调用在哪里?
  • 在我的节点路由'app.get('/test')'
  • 您必须从您的客户端应用程序调用该 api。否则不会被调用

标签: node.js express reactjs react-router


【解决方案1】:

ReactJS 应用程序是单页应用程序 (SPA),通常它们从 express.js 的根目录 ("/") 提供服务em> 服务器。但是,任何静态网页不同,SPA 不会在每次路由更改时调用服务器,而是依赖于 虚拟路由 和它自己的客户端 -支线处理程序。 (如果您想知道,为什么 SPA 不刷新页面,这就是背后的原因,有点)。如果 SPA 使用其客户端路由处理程序中定义的任何路由,express 将始终将其视为根路由 "/" 并且什么也不做,实际上它不会什么都不知道,因为浏览器不会发出任何请求。

React-Router 提供这些 虚拟路由ReactJS 应用程序。

在您的代码中,当您的 React 应用从 "/" 转到 "/index" 或使用 React-Router定义的任何其他路由时>,它不会向 express 服务器请求任何东西,而是通过客户端/浏览器完成所有操作。这就是为什么,即使你有一个为 ReactJS 定义为 "/test" 的路由,它也不会调用服务器端的任何东西。

顺便说一下,这些虚拟路由也将被React在服务器端使用,当且仅当你使用 React 的服务器端渲染。但是,express 不会知道这些。无论您使用客户端,Express 的行为总是相同的端渲染或服务器端渲染。)

现在,最后,如果您希望调用 express 路由 "/test",则必须进行 fetch向路由请求,因此路由将被调用。 (看看isomorphic-fetch,如果想知道使用哪个库)

希望这些能派上用场

【讨论】:

  • 非常感谢您的回答!我现在一切都清楚了。事实上,我必须在我的 AJAX 调用中调用一个 url 来填充我的组件,我想象了这个解决方案(我的服务器中的路由“/test”)。我将测试同构提取。但是,这是在反应思维中做到这一点的好方法吗??
  • 您能否详细说明您的问题,我的意思是,您要求的方式是什么?
  • 事实上,我正在寻找一种用存储在 Mysql 数据库中的数据填充我的反应组件的好方法。我认为 AJAX 调用是一个好方法。所以在我的客户端,我从我的服务器调用一个 url,我返回一个 JSON。然而,我开始向我介绍通量架构。我有点迷茫,所以我问你是否认为在 componentWillMount 中进行 AJAX 调用是一种在通量架构中通过反应思维获取数据的 goog 方式?通过 isomorphic-fetch 从我的服务器调用 url 看起来很奇怪。我有一种不自然的感觉……
  • React 不控制数据。通常使用通量实现来控制数据。 ReduxJS 和 RelayJS 是最常用的通量实现。您在“componentDidMount”连接并有效时获取数据的想法,但您的意见是正确的。使用通量实现更结构化地处理数据。虽然通量实现将使用“isomorphic-fetch”来接收数据(如果你使用的话),但 React 不会意识到这一点。 (我知道这是自吹自擂,不过大家可以看marufsarker.github.io/blog/posts/2016/05/09/…了解一点他们的作品)
  • 我会看到的。谢谢你的帮助:)
猜你喜欢
  • 2015-04-17
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多