【问题标题】:Can I have koa-static serve assets at a custom (e.g., /static/) path?我可以在自定义(例如 /static/)路径中使用 koa-static 服务资产吗?
【发布时间】:2015-09-30 21:11:06
【问题描述】:

https://github.com/koajs/static 的文档和我尝试 koa-static 的个人经验让我相信您可以从应用的根 URL 提供文件。

例如:

app.use(serve('./some/dir/'));

鉴于上述serve 的使用,访问文件./some/dir/something.txt 的URL 将是localhost:3000/something.txt。似乎没有办法配置我的应用程序,以便在 localhost:3000/static/something.txt 提供相同的文件(以及同一目录中的所有其他文件)。

我是 Node 和 Koa 的新手,所以我才刚刚开始深入研究,我可能遗漏了一些非常明显的东西。

我尝试使用 koa-route 来实现:

app.use(route.get('/static/*'), serve(__dirname + '/some/dir'));

但在请求/static/something.txt 时,我遇到了以下情况:

  TypeError: Cannot read property 'apply' of undefined
      at Object.<anonymous> (/Users/me/example/src/node_modules/koa-route/index.js:34:18)
      at GeneratorFunctionPrototype.next (native)
      at onFulfilled (/Users/me/example/src/node_modules/koa/node_modules/co/index.js:64:19)
      at /Users/me/example/src/node_modules/koa/node_modules/co/index.js:53:5
      at Object.co (/Users/me/example/src/node_modules/koa/node_modules/co/index.js:49:10)
      at Object.toPromise (/Users/me/example/src/node_modules/koa/node_modules/co/index.js:117:63)
      at next (/Users/me/example/src/node_modules/koa/node_modules/co/index.js:98:29)
      at onFulfilled (/Users/me/example/src/node_modules/koa/node_modules/co/index.js:68:7)
      at /Users/me/example/src/node_modules/koa/node_modules/co/index.js:53:5
      at Object.co (/Users/me/example/src/node_modules/koa/node_modules/co/index.js:49:10)

【问题讨论】:

    标签: node.js static-files koa


    【解决方案1】:

    当然可以。正如公认的答案所说,诀窍是使用 koa-mount 和 koa-static。虽然我不明白他为什么不提供实际静态文件的示例。这对我有用(在 Koa2 中):

    .use(serve('public'))
    .use(mount('/static', serve('static')))
    

    两个文件夹(公共和静态)都在我项目的根目录中。但是第一个是在用户访问/ 时提供的,而第二个是在用户访问/static 时提供的。 就是这样。

    【讨论】:

      【解决方案2】:

      您可以使用koa-static-folder。如果您仍然感兴趣。

      【讨论】:

      • 如何使用 koa-static-folder 在自定义路径上服务?
      【解决方案3】:

      要将中间件重新定位到应用程序 url 的另一部分,您可以使用 koa-mount

      'use strict';
      const koa = require('koa');
      const mount = require('koa-mount');
      
      const app = koa();
      app.use(function* () { this.body = 'Hello, world'; });
      app.use(mount('/foo', function*() { this.body = 'Hello, foo'; }));
      
      app.listen(3000);
      
      curl localhost:3000
      > 'Hello, world'
      curl localhost:3000/foo
      > 'Hello, foo'
      

      koa-router 本身 does not support regex paths or parameter matching

      【讨论】:

      • 这不是我要找的。我说的是在我自己的应用程序的自定义 URL 路径上提供服务,而不是来自外部资源。 IOW,我想提供我自己的静态文件,但来自 /static/ 路径(相对于根)。
      • 对不起,我误会了。我在你编辑你的问题之前回答了,并进行了相应的修改。
      • 非常感谢。你可能又为我节省了 3 个痛苦的小时。我很惊讶实现这一点的唯一方法(大概)是创建一个单独的应用程序并以这种方式安装它(需要重新注册日志记录和其他中间件),但它工作得很好。
      • mount 适用于任何中间件(准确地说,它适用于生成器函数),不一定是单独的 koa 应用程序(恰好也是生成器函数)。您可以使用 koa-composemount 组合中间件。
      • 我尝试了app.use(mount('/static', serve(__dirname + '/static')));(完美运行),因为 koa-compose 已经有一段时间没有更新了。不过我可能会坚持使用第二个应用程序,这样我就可以使用许多中间件。
      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 2015-08-14
      • 2011-06-10
      • 2014-08-01
      相关资源
      最近更新 更多