- Koa开发:入门、进阶与实战
- 刘江虹
- 686字
- 2022-03-08 10:50:23
2.1 中间件的使用
中间件是Koa的精髓,也是Koa最重要的一部分。如果读者能够很好地理解中间件的原理并运用自如,那么就掌握了Koa的基础知识。
那么怎么理解中间件呢?读者应该听过杨宗纬的一首歌曲《洋葱》,里面有句经典歌词是这么写的:“如果你愿意一层一层一层地剥开我的心,你会发现,你会讶异,你是我最压抑、最深处的秘密……”中间件的运行原理就可以类比为洋葱结构,每一个中间件就相当于洋葱的一层结构,不同中间件可以实现不同的功能,比如,当一个请求发送过来,最外层的中间件可以判断请求是否是恶意攻击,如果是恶意攻击,那么该中间件就会直接把请求拒之门外。下面简单看一下洋葱模型的构造,如图2-1所示。
图2-1 洋葱模型
图2-1能够很好地解释Koa中间件的功能和结构,请求从左侧进入,响应从右侧离开,中间件可以在每一层设置关卡,做不同类型的工作,这就是Koa的中间件原理。下面用一个实例来直观地了解中间件的执行过程,代码如下。
const Koa = require('koa') const app = new Koa() app.use(async (ctx, next) => { // 第一个中间件 console.log('---1--->') await next() console.log('===6===>') }) app.use(async (ctx, next) => { // 第二个中间件 console.log('---2--->') await next() console.log('===5===>') }) app.use(async (ctx, next) => { // 第三个中间件 console.log('---3--->') await next() console.log('===4===>') }) app.listen(4000, () => { console.log('server is running, port is 4000') })
这里app.use()是一个回调函数,该回调函数有两个参数,一个是ctx,一个是next()函数,读者可以把app.use()理解为一个中间件,那么上述代码就有3个中间件了,每个中间件以await next()函数为分界,上面的代码对应洋葱模型的左侧,下面的代码对应洋葱模型的右侧。通过类比,上述代码的输出结果也就很好理解了,输出结果如图2-2所示。
图2-2 中间件运行结果
通过上述实例,读者可以进行扩展性的思考,这里的console.log()函数是不是可以做一些其他的工作,比如收集请求,用于监控,或者收集日志做日志模块,方便排查问题等。