【问题标题】:node js express route all pathsnode js express路由所有路径
【发布时间】:2013-08-22 22:35:18
【问题描述】:

我正在使用快递。我喜欢创建一个路由,将所有类型为“get”的请求导航到“/assets/app/static/pagePath”,并使用 url 前缀“/app/static/*pagePath”。 我正在尝试执行以下操作,但不起作用。

app.get('/app/static/*path', function (req, res) {
    res.sendfile('assets/app/static/' + req.params.path);
});

有什么想法吗?

【问题讨论】:

  • 你是要使用:path吗?
  • @JoachimIsaksson:如果用户会去app/static/a/b/c.html并且路由是/app/static/:path,那么path会等于“a/b/ c.html”?

标签: node.js express routes


【解决方案1】:

只需使用带有前缀和一些短路逻辑的中间件:

app.use('/app/static', function (req, res, next) {
  if (req.method !== 'get') {
    next();
    return;
  }
  res.sendFile(__dirname + '/assets' + req.path);
});

(这是未经测试的,所以可能不是 100% 准备好,但你明白了)

其实,再看看你的问题,你确定这不能由刚刚给定正确根目录的express.static中间件处理吗?

app.use('/app/static', express.static(__dirname + '/assets'));

【讨论】:

  • 是的,你可以有多少你想要的,只要有额外的app.use 电话。
【解决方案2】:

如果你想包含子目录,你可以使用正则表达式;此正则表达式将匹配/app/static/ 下的任何目录/文件结构

app.get(/^\/app\/static\/(.*)/, function (req, res) {
    console.log('assets/app/static/' + req.params[0]);
    res.sendfile('assets/app/static/' + req.params[0]);
});

关于您关于多个静态目录的问题,是的,您可以。就app.use两者;

app.use("/static", express.static(__dirname + "/assets"));
app.use("/static", express.static(__dirname + "/alternate_assets"));

文件将从找到它的第一个目录提供(首先搜索/assets,然后搜索/alternate_assets),但为了避免混淆,您可能希望避免在两个目录中使用相同的文件名。

【讨论】:

    【解决方案3】:

    过去没有其他答案对我有用,因为它们缺少两个小细节:

    • app.use 定义静态目录的调用应该是异步的(例如包装在一个函数中),否则它们会在 websocket 完成建立连接之前尝试执行(在我看来,这是 Connect 的一个问题-- Express 所基于的框架;我应该能够在文件顶部开始编写我的代码)。

    • 这些定义需要发生在之前您在该(异步)函数体内发送将引用 URL 的 HTML 文件。

    像这样:

    app.get('/', function (req, res) { 
      app.use('/static', express.static(__dirname + '/static'));
      res.sendfile(__dirname + '/index.html'); 
    });
    

    然后您可以将它们直接包含在您的 HTML(或 SVG 等)中,如下所示:

    <link rel="stylesheet" href="static/index.css">

    <image x="0" y="0" xlink:href="static/picture.svg" />

    • 等等

    【讨论】:

      【解决方案4】:

      GET /app/static/foo/bar/buz ---> req.path === /app/static/foo/bar/buz 所以:

      app.get('/app/static/:path*', function (req, res) {
          res.sendfile('assets' + req.path);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-04
        • 2020-03-26
        • 1970-01-01
        • 2011-09-03
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        相关资源
        最近更新 更多