Express:在子路由上提供静态文件

时间:2017-11-10 15:58:56

标签: express url-routing create-react-app

我正在尝试使用Express和/进行路由工作。

我的目标是在网址为/login时将用户发送到应用程序的主页,并在网址与server.js匹配时将用户发送到登录页面。

在我的var mainRoutes = require("./routes/mainRoutes"); var apiRoutes = require("./routes/apiRoutes"); [...] app.use("/", mainRoutes); app.use("/api", apiRoutes); 我定义了两条路线:

apiRoutes

虽然mainRoutes包含所有api路由定义,但var express = require("express"); var path = require("path"); let router = express.Router(); router.route("/").get((req, res, next) => { res.sendFile("index.html", { root: "./client/build/" }); }); router.route("/login").get((req, res, next) => { res.send("This is the login page"); }); module.exports = router; 负责主导航(至少这是主意):

// Priority serve any static files.
app.use(express.static(path.join(__dirname, "client/build")));

// All remaining requests return the React app, so it can handle routing.
app.get("*", function(req, res) {
  res.sendFile(path.join(__dirname + "/client/build/index.html"));
});

在某处,我读到了有关提供create-react-app构建过程所产生的静态资产的信息,所以我补充说:

/login

添加这些行后,我成功查看了我的index.html但我无法访问/apimainRoutes子路由,因为它每次都会在主页面(index.html)上重定向。< / p>

这就像我需要在我的子路由{{1}}上提供静态文件,但我不知道如何做到这一点。

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

app.get('*')会匹配您拥有的每条路线。

你应该这样做:

var mainRoutes = require("./routes/mainRoutes");
var apiRoutes = require("./routes/apiRoutes");

[...]

app.use(express.static(path.join(__dirname, "client/build")));

app.use("/", mainRoutes);
app.use("/api", apiRoutes);

// If the app reaches this point, it means that 
// the path did not match any of the ones above
app.use(function(req, res, next){
  // redirect the user to where we serve the index.html
  res.redirect('/');
});

答案 1 :(得分:0)

create-react-app我认为处理路由不同,你不能将浏览器的路由连接到你想要服务的路由,因为你正在运行单页应用程序&#34;,除非你做与服务器和js包的通用路由