【问题标题】:How to have Express.js server file using router path as root?如何使用路由器路径作为根拥有 Express.js 服务器文件?
【发布时间】:2020-09-10 18:05:07
【问题描述】:

我有这样的目录结构

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/。我不明白为什么在静态服务时服务器知道使用/private 作为root,但在使用路由器时它使用/ 作为root。

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

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

【问题讨论】:

    标签: html node.js express


    【解决方案1】:

    您可以使用中间件修改请求的 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 错误。

    【讨论】:

    • 感谢您的回复!我正在寻找更通用的解决方案,因为这仍然需要我编辑每个进行相对引用的 html 和 js 文件。如果我决定将来重命名/移动私有目录,那么每个引用的文件都需要修改。
    • 我更新了我的答案以更好地满足您的要求。您可能需要为其添加一些逻辑,但它应该可以工作。
    • 没用,js和css文件还是指向/而不是/private。私有路由器最终也会转到 /private 而不是 /
    • 正如我所说,您需要添加一些逻辑,例如if(req.path === "/"){next();}。另外,不要将代码放在路由器中,而是放在主应用程序中。 (在 app.js 中,而不是 privateRouter.js)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-05-18
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多