Search code examples
node.jsstatic-fileskoa

Can I have koa-static serve assets at a custom (e.g., /static/) path?


The docs at https://github.com/koajs/static and my personal experience trying out koa-static lead me to believe that you can only serve files from the root URL of your app.

For example:

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

Given the above use of serve, the URL to access a file ./some/dir/something.txt would be localhost:3000/something.txt. There doesn't seem to be a way to configure my app such that the same file (and all other files in the same dir) is served at localhost:3000/static/something.txt instead.

I'm new to Node and to Koa, so I've just begun to dive into this and I'm probably missing something really obvious.

I tried using koa-route to achieve this:

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

But upon requesting /static/something.txt I was met with the following:

  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)

Solution

  • To relocate middleware to another part of your app url-wise, you can use 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 itself does not support regex paths or parameter matching.