【问题标题】:How to use Express routes with React.js frontend?如何在 React.js 前端使用 Express 路由?
【发布时间】:2021-02-18 10:41:13
【问题描述】:

我可以使用快速路由来发送页面内容吗?在经典 HTML 中,您可以:

app.get("/admin", (req, res) => {
  res.sendFile("admin.html"); // or res.render() for templating engines like EJS
});

很遗憾,我无法使用 Express 路由为 React 页面提供服务。我发现的唯一方法是使用 React Router,它在技术上可以完成工作,但是我不能在服务器端做任何其他事情,比如验证登录。我可以在技术上为此在服务器端创建一个 API 端点,然后在 React JSX 页面本身中请求它,但是,由于许多原因,这会很不方便:

  1. 仅在页面之后发送请求,这意味着大量的加载指示和可能的问题,例如用户能够看到他根本看不到的内容。
  2. 大多数“页面访问”API 请求都需要使用密钥保护,例如授权密钥
  3. 如果 API 请求是在客户端的任何位置完成的,则密钥是不安全的,并且响应可以由用户手动更改,从而造成严重的安全违规。

如果有一个用于 Express 的 React 渲染器,您可以在其中直接从页面渲染一个 React JSX 文件(例如 res.render("page.jsx")),它会编译 React 并发送纯 HTML,那就太好了!但当然,我没能找到这样的,我怀疑有。

【问题讨论】:

  • 没有“反应页面”之类的东西。只有 HTML 页面会加载 React 包,它们只是 javascript <script> 加载,就像任何其他 JS 代码一样。这也是您的答案:您的服务器为页面 URL 请求生成 HTML 响应。如果根本没有服务器,那么该 HTML 会执行相同的操作:根据需要加载 css/scripts。
  • @nortex_dev 为什么不是你在 React 上创建这个页面,当用户在服务器中点击特定路由时,你可以轻松地从 react 重定向并显示你想要的内容

标签: reactjs express react-router


【解决方案1】:

是的,您可以,但仅限于捆绑的应用程序。您只需发送您在 react 应用程序的 build 文件夹中找到的 index.html。

看起来像这样: 假设您表达 index.js 并且反应应用程序位于您的应用程序的“客户端”目录中。

  const path = require("path");
  app.get("*", (req, res) => {
    res.sendFile(path.resolve(__dirname, "client", "build", "index.html"));
  });

【讨论】:

  • 当你的 React 应用程序和 Node 应用程序在同一个 url 上运行时,这种类型的配置不适用吗(这很可能在生产中取决于部署者)?如果不能,请解释一下路由将如何区分,可能路由 A 将在 Node 中维护,路由 B 发送到 React
  • 如果我希望一个路由受到服务器端保护,同时保持其他路由正常怎么办?
  • @nortex_dev 你可以在 express 中实现这个槽式认证中间件。如果您喜欢 JWT,请查看 express-jwt :) 它应该说明如何保护那里的个人路线。会话也可能发生类似的事情:)
  • @NtshemboHlongwane 这取决于你如何播放它。如果您通过 CDN 为您的 react 应用程序提供服务或配置 nginx 来执行此操作,这将是不必要的。但是,如果您这样做,您可以通过将反应应用程序路由到“*”以及由更具体的路由处理的其他路由来区分路由。但是您也可以通过“/react/*”之类的方式路由您的 React 应用程序。
  • @NtshemboHlongwane 我发布的代码实际上只是从我部署在 heroku 上的网络应用程序中复制粘贴的。所以正是你提到的用例:D
猜你喜欢
  • 2015-05-27
  • 2021-08-29
  • 2016-08-30
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多