当您具有已通过身份验证的路由和未通过身份验证的路由时,如何使用Express向客户端发送react应用?

时间:2018-09-26 04:04:58

标签: reactjs express jwt

我有一个节点应用程序,可以像这样为我的react应用程序提供服务:

// STATIC ASSETS WHEN PUSHED TO HEROKU
if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));
}
app.get("*", function(req, res) {
  res.sendFile(path.join(__dirname, "./client/public/index.html"));
});

通常这应该是您放置的最后一条路由,因为它会覆盖所有其他的get路由。但是,我有一些用于验证身份验证的中间件:

const jwt = require("express-jwt")
const auth = jwt({
  secret: process.env.JWT_SECRET,
  userProperty: 'payload'
});
app.use("/auth", authRoutes);
app.use(auth);
app.use("/api", routes);

/auth路由用于登录和注册,因此不受中间件保护,而/api路由受中间件保护。

但是,当我尝试使用该应用程序时,它无法正确地从API请求(例如GET /api/users)发送回数据,而是返回*路由中指定的HTML。

我是否可以通过身份验证的路由,仍然可以正确地为我的react应用服务?

1 个答案:

答案 0 :(得分:0)

您可以将HTML路由放在底部,并且仅使API路由使用auth中间件。这将不会为您的静态页面执行身份验证中间件,并且只会授权/api路由。

const jwt = require("express-jwt")
const auth = jwt({
  secret: process.env.JWT_SECRET,
  userProperty: 'payload'
});
app.use("/auth", authRoutes);
app.get("/api", auth, routes);



 // STATIC ASSETS WHEN PUSHED TO HEROKU
if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));
}
app.get("*", function(req, res) {
  res.sendFile(path.join(__dirname, "./client/public/index.html"));
});