如果说 ctx 是任务卷宗,那么 app.use() 就是整个巡防宇宙的搭建动作。
Koa 应用本质上就是一串被组合起来的中间件。app.use() 每调用一次,就等于往塔里再挂一层关卡。
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: '通过全部关卡' }
})这段代码的本质不是“注册了三个函数”,而是:
巡防塔
├── 第1层:日志关卡
├── 第2层:鉴权关卡
└── 第3层:核心处理舱再记住三个最关键的纪律:
#1. 顺序就是关卡顺序
先注册的在外层,后注册的在内层。
#2. await next() 决定是否继续深入
- 写了
await next():放行到下一层 - 不写:在当前层就截停
- 写了但不
await:你大概率在埋逻辑雷
#3. app.use() 适合全局关卡
比如:
- 请求日志
- 统一错误处理
- Trace ID
- CORS
- 通用鉴权
- 响应时间
如果你是某一条具体航线才需要的逻辑,更常见的做法是挂到路由层,而不是全局 app.use()。