如何让Express.js服务器文件使用路由器路径作为根目录?

问题描述 投票:1回答:1

我的目录结构是这样的

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);

in 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,但从浏览器请求jscss文件时,服务器返回的是 http://mywebsite.com/js 而不是 http://mywebsite.com/private/js因此返回文件未找到。

或者,如果我静态地提供文件,浏览器就知道要从 /private/js:

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

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

我如何才能保持网址为 http://mywebsite.com/private 而不必附加 private/ 在客户端的所有文件引用中?

我是express.js的新手,我也很难表述这个问题。我想我对express.js的工作原理有一些根本性的误解。谢谢大家的帮助!

html node.js express
1个回答
0
投票

你可以使用中间件修改请求的URL,用于内部路由。

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

你也可以使用 基础 标签,这意味着你只需要在每个页面上指定一次基本URL。

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

这样就可以将请求发送到

  • privatecssindex.css

  • 私有jsindex.js,但你仍然需要代码来处理这些路径,否则,你仍然会得到404没有找到的错误。

然而,你仍然需要代码来处理这些路径,否则,你仍然会得到404 not found错误。

© www.soinside.com 2019 - 2024. All rights reserved.