2

我正在使用快递。我喜欢创建一个路由,将所有类型为“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);
});

任何的想法?

4

4 回答 4

3

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

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'));
于 2013-08-20T18:54:58.523 回答
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是 ),但为了减少混淆,您可能希望避免在两个目录中使用相同的文件名。

于 2013-08-20T19:20:30.447 回答
0

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

  • 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" />

• ETC。

于 2014-06-15T15:36:25.110 回答
0

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);
});
于 2016-08-05T07:20:55.520 回答