路由中间件
💡TIP
当前推荐把 HTTP 中间件直接挂到 koaRouter 上管理,而不是依赖隐式目录约定。
基础写法
src/index.ts
import KoaRouter from 'koa-router'
import { defineChildren } from 'alemonjs'
const router = new KoaRouter({ prefix: '/demo' })
router.use(async (ctx, next) => {
ctx.state.requestId = crypto.randomUUID()
await next()
})
router.get('/ping', ctx => {
ctx.body = {
code: 200,
requestId: ctx.state.requestId,
message: 'pong'
}
})
export default defineChildren({
register() {
return {
koaRouter: router
}
}
})
解析 Body
可以直接使用 Koa 生态中间件,例如 koa-bodyparser:
src/index.ts
import KoaRouter from 'koa-router'
import bodyParser from 'koa-bodyparser'
import { defineChildren } from 'alemonjs'
const router = new KoaRouter({ prefix: '/demo' })
router.use(bodyParser())
router.post('/echo', ctx => {
ctx.body = {
code: 200,
data: ctx.request.body
}
})
export default defineChildren({
register() {
return {
koaRouter: router
}
}
})
按前缀拆分
如果一个应用里有多组 HTTP 能力,建议拆成多个 router:
const apiRouter = new KoaRouter({ prefix: '/api' })
const adminRouter = new KoaRouter({ prefix: '/admin' })
adminRouter.use(async (ctx, next) => {
// 管理侧鉴权
await next()
})
export default defineChildren({
register() {
return {
koaRouter: [apiRouter, adminRouter]
}
}
})
推荐理解
- 中间件跟着显式注册的
koaRouter走 - 权限、审计、Body 解析都尽量显式挂载
- 不依赖隐式目录规则,边界会更清楚