中间件工作原理
- 初始化koa实例后,我们会用
use
方法来加载中间件(middleware),会有一个数组来存储中间件,use调用顺序会决定中间件的执行顺序。 - 每个中间件都是一个函数(不是函数将报错),接收两个参数,第一个是ctx上下文对象,另一个是next函数(由koa-compose定义)
- 在建立好http服务器后,会调用koa-compose模块对middleware中间件数组进行处理。具体代码这里就不贴了,原理就是:会从middleware数组中取第一个函数开始执行,中间件函数中调用next方法就会去取下一个中间件函数继续执行。每个中间件函数执行完毕后都会返回一个promise对象。(ps:调用next方法并不是表示当前中间件函数执行完毕了,调用next之后仍可以继续执行其他代码)
示例代码
const Koa = require("koa"); const app = new Koa; app.use(async (ctx, next) => { console.log('1'); await next(); // 调用下一个middleware console.log('5') }); app.use(async (ctx, next) => { console.log('2'); await next(); // 调用下一个middleware console.log('4'); }); app.use(async (ctx, next) => { console.log('3'); }); app.listen(3000) console.log("listening on port 3000")
我们把每个async函数称为middleware,
输出结果: 12345
在这个例子里,通过输出结果可以看出三个中间件的执行顺序是:中间件1 -> 中间件2 -> 中间件3 -> 中间件2 -> 中间件1
中间件函数队列,会在最后一个中间件或一个没有调用next的中间件那里停止。就比如第2个中间件没有调用next,那么后续的中间件函数都不会执行。输出 1245
参考链接: