这是 Koa 初学者最容易误会的地方之一:
Koa core 不自带路由。
它是一个极薄的 HTTP middleware foundation。
所以到了真实项目里,你通常会自己拼出一套常见组合:
Koa Core
├── @koa/router -> 路由分发
├── @koa/bodyparser -> JSON / form / text 请求体
├── @koa/cors -> CORS
├── koa-static -> 静态资源
└── koa-body -> multipart / 上传等更重请求体场景到 2026-03-28,主流路线里最常见的路由器依然是 @koa/router。
先看最小实战形状:
npm i koa @koa/router @koa/bodyparserimport Koa from 'koa'
import Router from '@koa/router'
import { bodyParser } from '@koa/bodyparser'
const app = new Koa()
const router = new Router({ prefix: '/api' })
router.get('/patrols/:id', async (ctx) => {
ctx.body = {
id: ctx.params.id,
status: '巡防中',
}
})
router.post('/alerts', async (ctx) => {
const payload = ctx.request.body
ctx.status = 201
ctx.body = {
id: 'alert_001',
received: payload,
}
})
app
.use(bodyParser())
.use(router.routes())
.use(router.allowedMethods())
app.listen(3000)这段代码背后的巡防图是:
请求进入 Koa
│
▼
bodyParser 先解析请求体
│
▼
router.routes() 按路径和方法分流
│
▼
具体 handler 执行业务
│
▼
allowedMethods() 处理 OPTIONS / 405 / 501 这类方法语义这里有几个必须讲透的点:
#1. ctx.params 不是 Koa core 自带的
它通常来自 @koa/router。
#2. router.allowedMethods() 很实用
它能自动处理:
OPTIONS405 Method Not Allowed501 Not Implemented
这比你自己手写方法判断稳得多。
#3. @koa/bodyparser 不处理 multipart
如果你要文件上传、复杂 multipart 表单,常见路线是 koa-body 或 @koa/multer 这类方案,不是继续指望 @koa/bodyparser。
所以你要建立的认知不是:
Koa = 一个完整大框架而是:
Koa = 核心巡防塔
生态模块 = 各种外挂关卡和分流器