#1. 误以为 Koa 自带路由、body parser、校验全家桶
不是。
Koa core 很薄,很多能力都要靠生态模块拼起来。
#2. 写了 next() 却不 await next()
这会把洋葱模型的上下游逻辑搞乱。
Koa 的核心不是“调用一下 next”,而是等下游回来。
#3. 忘了设置 ctx.body
Koa 默认状态码是 404。
你以为 handler 跑完就算成功,实际上客户端可能拿到的是 404。
#4. 在 ctx 上到处乱挂字段
中间件共享数据优先用 ctx.state。
别把 ctx 自己变成一个随手乱贴便签的墙。
#5. 直接操作原始 res.write() / res.end()
Koa 官方明确不建议你绕过自己的响应系统。
除非你非常确定在干什么,否则就用 ctx.body、ctx.status、ctx.set()。
#6. 滥用 app.context
app.context 可以做全局扩展,但官方也明确提醒这可能变成一种反模式。
请求内数据流转,优先还是 ctx.state。
只有非常明确的全局能力,才考虑挂到 app.context。
#7. 拿旧时代教程里的 generator 中间件来学
Koa v1 那套历史写法别再抄了。
到 2026 年,你应该默认站在 async/await 和 Koa v3 的语境里理解它。
#8. 以为 Koa 的“轻”就等于“更简单”
不是。
Koa 的轻,换来的是更高的架构自觉要求。
你少了框架包办,也就更要自己决定:
- 中间件边界怎么划
- 错误格式怎么统一
- 路由层和业务层怎么分
- 共享上下文怎么治理