首页 > 解决方案 > 如何使用路由器路径作为根拥有 Express.js 服务器文件?

问题描述

我有这样的目录结构

root
  private
    js
    css
    index.html
  app.js
  privateRouter.js
  ...

在我的 index.html 中,我使用这样的相对路径引用了 js 和 css 文件:

<link rel="stylesheet" href="css/index.css"/>
<script src="js/index.js"></script>

在服务器端,我有一个私有路由器在提供这些文件之前检查身份验证:

在 app.js 中:

app.use("/private", privateRouter);

在 privateRouter.js 中:

router.use((req, res, next) => {
    isAuthenticated(req) ? next() : res.redirect("/");
});

router.get('/', function(req, res, next) {
    res.sendFile(require('path').join(__dirname + "/private/index.html"));
});

所以现在如果我访问http://mywebsite.com/private我会得到 index.html,但是来自浏览器的 js/css 文件请求返回到服务器http://mywebsite.com/js而不是http://mywebsite.com/private/js,因此返回文件未找到。

或者,如果我静态提供文件,浏览器知道从以下位置请求/private/js

app.use("/private", express.static(path.join(__dirname, 'private')));

但我不能静态服务器,因为我需要对特定文件进行身份验证,而不是公开提供所有文件。而且我不想private/在客户端的所有文件引用之前附加。我不明白为什么在静态服务时服务器知道以/privateroot 身份使用,但在使用路由器时它/以 root 身份使用。

如何保留 url,http://mywebsite.com/private而不必private/在客户端的所有文件引用中附加?

我是 express.js 的新手,我也很难提出这个问题。我认为我从根本上误解了 express.js 的工作原理。谢谢你的帮助!

标签: htmlnode.jsexpress

解决方案


您可以使用中间件修改请求的 URL 以进行内部路由:

app.use((req,res,next)=>{
  req.url = "/private" + req.url; // prepend "/private" to the url
  next();
});

您还可以使用base标记设置基本 URL,这意味着您只需为每个页面指定一次基本 URL。

<html>
  <head>
    <base href="private">
    <link rel="stylesheet" href="css/index.css"/>
    <script src="js/index.js"></script>
  </head>
</html>

这应该将请求发送到:

  • /private/css/index.css

  • /private/js/index.js

但是,您仍然需要代码来处理这些路径,否则,您仍然会收到 404 not found 错误。


推荐阅读