中间件
如果把数据理解为一条流水线上的产品,中间件就像是流水线旁的工人,可以对产品(数据)进行一些加工或者其他的操作,处理完后让其继续流动。
提到Koa2
就避不开它的洋葱圈模型中间件,这个图了解过Koa2
的应该都见过。
它的数据流向是由外到内,再由内而外的。安装koa
运行一个简单的server
用代码看一下
const Koa = require('koa');
const app = new Koa();
const PORT = 3000;
// app.use启用中间件
app.use(async (ctx, next) => {
console.log(1)
await next()
console.log(6)
});
app.use(async (ctx, next) => {
console.log(2)
await next() // 如果注释这行,那么打印的就是1 2 5 6
console.log(5)
});
app.use(async (ctx, next) => {
console.log(3)
await next()
console.log(4)
});
app.listen(PORT, () => {
console.log(`server is running at http://localhost:${PORT}`)
});
// 打开网页会打印出1 2 3 4 5 6
中间件函数有两个形参,一般取名ctx
和next
,next
是一个方法,这个方法起到一个传递的作用,当遇到next()
时,会跳过next()
下面的代码执行下一个中间件,如果没有遇到next()
那么到此为止,开始调用之前跳过的那部分代码,从代码的层面上看,就是由上到下,再由下到上调用。
注意:因为中间件的调用是层层传递的,所以中间件的执行顺序很重要
例子
中间件的用途有很多,比如之前 Koa2编写基本后端接口(二) 中的注册接口中每次响应都这么写会很麻烦,可以做一个统一响应中间件
ctx.body = {
code: 200,
message: '注册成功',
}
跟router
同样的模块化处理,将app.use((ctx,next)=>{})
中的回调函数抽出放到单独的文件中,剩下就是导出引入调用
主要思路是将要响应的信息和数据挂载到ctx
上,中间件中可以拿到数据加工成想要的格式
// middleware.js
const handleResponse = ctx => {
ctx.type = 'application/json'
ctx.body = {
code: 200,
message: ctx.msg || 'success',
data: ctx.result || null,
}
}
...
// app.js中启用中间件
...
app.use(handleResponse) // 这个中间件最好放在最后,因为这是对用户请求的响应处理,基本上是最后一关
...
// 使用
...
const res = await Services.getUserList()
ctx.msg = '请求成功'
ctx.result = res
...
还可以配置其他中间件,比如日志打印,鉴权,统一错误处理等等