1. 中间件机制
Koa 通过调用 middleware 中间件来实现所需要的功能。中间件之间通过串联机制来执行,类似 Express 中的 connect,和 .NET Core 里面的中间件机制基本相同。
譬如有两个中间件 A、B、C 注册在 Koa 上,那么当请求进来时,会先调用 A、A 再调用 B、B 再调用 C,C 处理后,B 再处理 C 的结果,A 再处理 B 的结果。即Koa 的处理有 downstream 和 upstream 两条执行路径。形象一点描述,downstream 处理到触底后,反弹执行就是 upstream。
2. 官方实例
2.1 代码
//
// Reference:
// https://koajs.com
//
// test script:
// curl 'http://localhost:3000/'
//
const Koa = require('koa')
const app = new Koa()
// logger
app.use(async (ctx, next) => {
console.log('logger downstream')
await next()
console.log('logger upstream')
const rt = ctx.response.get('X-Response-Time')
console.log(`${ctx.method} ${ctx.url} - ${rt}`)
})
// x-response-time
app.use(async (ctx, next) => {
console.log('x-response-time downstream')
const start = Date.now()
await next()
console.log('x-response-time upstream')
const ms = Date.now() - start
ctx.set('X-Response-Time', `${ms}ms`)
})
// response
app.use(ctx => {
console.log('response downstream')
// text/plain; charset=utf-8
ctx.body = 'Hello Koa\n'
// application/json; charset=utf-8
//ctx.body = {message: 'Hello Koa'}
})
app.listen(3000)
console.log('service listen on port 3000 ...')
2.2 结果
service listen on port 3000 …
logger downstream
x-response-time downstream
response downstream
x-response-time upstream
logger upstream
GET / - 4ms
可以看到,最后 4ms 是由 logger 中间件输出的。
附录:参考
如果需要详细了解 middleware 内部机制的,请参考这篇文章【深入理解 Koa2 中间件机制】。