Koa 中间件方式理解

对 koa 的理解源于一次 node 群的讨论。

官网例子:

var koa = require("koa")
var app = koa()

// logger

app.use(function*(next) {
var start = new Date()
yield next
var ms = new Date() - start
console.log("%s %s - %s", this.method, this.url, ms)
})

// response

app.use(function*() {
this.body = "Hello World"
})

app.listen(3000)

执行方式为 遇到 yield 跳入下一个 中间件,当执行到最后一个中间件,逆向执行回去。(一进一出回形针)

上图增强理解:

下面的 generator 被上面的调用形成嵌套
当执行到 yield ,则继续向下嵌套。
到下面没有中间件的时候,则最内层的 generator 结束。然后继续执行外层 generator
每层都执行到当前 generator 结束,直到最外层(第一个中间件 generator)的结束

下面为进出的核心代码

koa-compose

/**
* Expose compositor.
*/

module.exports = compose

/**
* Compose `middleware` returning
* a fully valid middleware comprised
* of all those which are passed.
*
* @param {Array} middleware
* @return {Function}
* @api public
*/

function compose(middleware) {
return function*(next) {
if (!next) next = noop()

var i = middleware.length

while (i--) {
next = middleware[i].call(this, next)
}

yield* next
}
}

/**
* Noop.
*
* @api private
*/

function* noop() {}