2.1 中间件的使用

中间件是Koa的精髓,也是Koa最重要的一部分。如果读者能够很好地理解中间件的原理并运用自如,那么就掌握了Koa的基础知识。

那么怎么理解中间件呢?读者应该听过杨宗纬的一首歌曲《洋葱》,里面有句经典歌词是这么写的:“如果你愿意一层一层一层地剥开我的心,你会发现,你会讶异,你是我最压抑、最深处的秘密……”中间件的运行原理就可以类比为洋葱结构,每一个中间件就相当于洋葱的一层结构,不同中间件可以实现不同的功能,比如,当一个请求发送过来,最外层的中间件可以判断请求是否是恶意攻击,如果是恶意攻击,那么该中间件就会直接把请求拒之门外。下面简单看一下洋葱模型的构造,如图2-1所示。

0

图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所示。

0

图2-2 中间件运行结果

通过上述实例,读者可以进行扩展性的思考,这里的console.log()函数是不是可以做一些其他的工作,比如收集请求,用于监控,或者收集日志做日志模块,方便排查问题等。