Koa2编写基本后端接口(三)

1,336 阅读2分钟

中间件

如果把数据理解为一条流水线上的产品,中间件就像是流水线旁的工人,可以对产品(数据)进行一些加工或者其他的操作,处理完后让其继续流动。

提到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

中间件函数有两个形参,一般取名ctxnextnext是一个方法,这个方法起到一个传递的作用,当遇到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
...

还可以配置其他中间件,比如日志打印,鉴权,统一错误处理等等