Skip to content

Koa

Koa 是由 Express 原班人马打造的下一代 Node.js Web 框架,旨在为 Web 应用和 API 提供一个更小、更具表现力和更健壮的基础 。Koa 的核心不包含任何中间件,而是提供了一套优雅的方法,使得编写服务器既快速又愉快

核心理念

Koa 的主要目标是利用 async 函数来摆脱回调地狱,并极大地改善错误处理 。它基于 ES6 规范构建,这使得构建复杂但可维护的应用程序变得更加容易

与 Express 不同,Koa 没有捆绑路由或模板引擎等功能,这使其核心非常轻量。开发者可以根据需要选择合适的模块,例如 koa-router 来处理路由

上下文 (Context)

Koa 的一个重要概念是 Context (上下文),它将 Node.js 的 requestresponse 对象封装到一个单独的对象中(通常称为 ctx)。这为编写 Web 应用和 API 提供了许多有用的方法

中间件

Koa 的中间件以一种类似于栈的方式组织和执行。通过 async/await,Koa 实现了“真正”的中间件,代码流程更符合逻辑,更易于理解

下面是一个简单的 Koa 应用示例,展示了中间件的使用:

javascript
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);

在这个例子中,请求会依次通过 logger、x-response-time 和最终的响应中间件。await next() 会将控制权传递给下一个中间件,直到中间件堆栈结束。

与 Express 的区别

  • 轻量级: Koa 的核心非常小,而 Express 提供了更多的内置功能
  • 异步处理: Koa 使用 async/await,而 Express 早期版本主要依赖回调函数。
  • 请求/响应对象: Koa 将 Node 的 reqres 封装在 Context 对象中,而 Express 是直接扩展这两个对象
  • 错误处理: Koa 通过 try/catch 提供了更自然的错误处理方式