全书目录

第三十六篇:Koa 完全指南 —— 洋葱关卡巡防宇宙

第五章:`app.use()` —— 你是在给巡防塔一层层加关卡

1 分钟 348 字 第 688 / 962 个阅读单元

如果说 ctx 是任务卷宗,那么 app.use() 就是整个巡防宇宙的搭建动作。

Koa 应用本质上就是一串被组合起来的中间件。
app.use() 每调用一次,就等于往塔里再挂一层关卡。

js
import Koa from 'koa'

const app = new Koa()

app.use(async (ctx, next) => {
  console.log('日志关卡')
  await next()
})

app.use(async (ctx, next) => {
  if (!ctx.get('Authorization')) {
    ctx.throw(401, '未授权进入巡防塔')
  }
  await next()
})

app.use(async (ctx) => {
  ctx.body = { message: '通过全部关卡' }
})

这段代码的本质不是“注册了三个函数”,而是:

text
巡防塔
├── 第1层:日志关卡
├── 第2层:鉴权关卡
└── 第3层:核心处理舱

再记住三个最关键的纪律:

#1. 顺序就是关卡顺序

先注册的在外层,后注册的在内层。

#2. await next() 决定是否继续深入
  • 写了 await next():放行到下一层
  • 不写:在当前层就截停
  • 写了但不 await:你大概率在埋逻辑雷
#3. app.use() 适合全局关卡

比如:

  • 请求日志
  • 统一错误处理
  • Trace ID
  • CORS
  • 通用鉴权
  • 响应时间

如果你是某一条具体航线才需要的逻辑,更常见的做法是挂到路由层,而不是全局 app.use()