核心功能
核心不捆绑任何中间件,只提供一个把 Node 请求与响应合并封装的 ctx 对象和一套洋葱式中间件机制。适合希望自己挑选每一层中间件、对框架体积和控制流有洁癖的 Node.js 服务。
功能亮点
洋葱式控制流
await next() 之前的代码先执行,next 返回后再执行剩余部分,天然适合做计时与日志
一个 ctx 装下请求与响应
中间件只接收 ctx 和 next,读路径写响应都在同一个对象上完成,不用同时端着 req 和 res
核心里没有中间件
框架不预置 body 解析、路由等能力,需要什么就 app.use 装什么,体积保持很小
async 取代回调
中间件写成 async 函数,异步错误可以用常规的 try/catch 捕获而非层层传递回调
属性多为委托
ctx 上大量存取器只是转发到 ctx.request 或 ctx.response,写法简短但底层对象仍可直取
适用场景
• 自行挑选每一层中间件的定制化 HTTP 服务,不想被框架预置组件绑住
• 需要在请求前后都插入逻辑的场景,如统计响应耗时、写访问日志
• 作为更上层框架或内部 Web 基建的底座,在其上封装团队自己的约定
安装配置
bash
前置条件:Koa 需要 node v18.0.0 或更高版本,以支持 ES2015 与 async 函数。 nvm install 22 npm i koa node my-koa-app.js
使用方法
javascript
// 最简单的 Koa 应用
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
// 中间件级联:日志 → 计时 → 响应
const Koa = require('koa');
const app = new Koa();
// logger
app.use(async (ctx, next) => {
await next();
const rt = ctx.response.get('X-Response-Time');
console.log(`${ctx.method} ${ctx.url} - ${rt}`);
});
// x-response-time
app.use(async (ctx, next) => {
const start = Date.now();
await next();
const ms = Date.now() - start;
ctx.set('X-Response-Time', `${ms}ms`);
});
// response
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
# 运行
node my-koa-app.js关键指标
尚未核验对标产品,此处只列本工具自身指标,不做对比结论。
指标Koa
价格免费
开源是
上手难度进阶
相关工具
同类工具
优点
- 中间件是 async 函数,await next() 天然形成先下游后上游的执行顺序,前后置逻辑写在同一个函数里
- ctx 把 Node 的 request 与 response 收进一个对象,并提供大量委托式存取器,写法比原生简洁
- 核心不捆绑任何中间件,依赖树小,每一层能力都由使用者显式选择
- 异步错误可用常规 try/catch 处理,官方称这正是采用 async 函数带来的改善
缺点
- 路由、请求体解析等基础能力都要自己找中间件补齐,起步阶段的选型工作比一体化框架多
- 要求 node v18.0.0 及以上,更老的运行时无法使用
- 洋葱式控制流需要理解 await next() 前后的执行时机,中间件写错顺序时排查成本较高