Source Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
'use strict'

/**
* Module Dependencies
*/

const debug = require('debug')('koa-static')
const { resolve } = require('path')
const assert = require('assert')
const send = require('koa-send')

/**
* Expose `serve()`
*/

module.exports = serve

/**
* Serve static files from `root`
*
* @param {String} root
* @param {Object} [opts]
* @return {Function}
* @api public
*/

function serve (root, opts) {
opts = opts || {}

// ensure `root`
assert(root, 'root directory is required to serve files')

// options
debug('static %s %j', root, opts)
// set opts.root to absolute one
opts.root = resolve(root)

// set default static file
if (opts.index !== false) opts.index = opts.index || 'index.html'

// if defer is supported
if (!opts.defer) {
return async function serve (ctx, next) {
let done = false

if (ctx.method === 'HEAD' || ctx.method === 'GET') {
try {
done = await send(ctx, ctx.path, opts)
} catch (err) {
if (err.status !== 404) {
throw err
}
}
}

if (!done) {
await next()
}
}
}

retrun async function serve (ctx, next) {
await next()
if(ctx.method !== 'HEAD' && ctx.method !== 'GET') return
// response is already handled
if (ctx.body != null || ctx.status !== 404) return

try {
await send(ctx, ctx.path, opts)
} catch (err) {
if (err.status !== 404) {
throw err
}
}
}
}

Usage

1
2
3
const Koa = require('koa')
const app = new Koa()
app.use(require('koa-static')(root, opts))

Options

  • maxage: default to 0.

  • hidden: Allow transfer of hidden files, detault to false.

  • index: Default file name, detault to ‘index.html’.

  • defer: If true, serves after return next().

  • gzip: default to true.

  • extensions: default to false.