Koa

Koa 简介与快速开始

了解 Koa 是什么、和 Express 的区别,学会初始化项目并写出第一个 Koa 应用。

🎯 引言

学完这篇文章,你能说清楚 Koa 是什么、它和 Express 有什么不同,还能亲手搭起一个 Koa 项目,让浏览器访问到你的第一个 hello world 页面。学完 Node.js 和 Express 之后,这是我们进阶后端框架的新一站。


🧱 什么是 Koa

Koa 是一个轻量的 Node.js Web 框架,它和 Express 出自同一支团队。团队在做 Express 时发现框架本身越来越重,于是重新设计了一个更精简的框架,这就是 Koa。

可以把 Express 和 Koa 想象成两种装修方案:Express 是“拎包入住的精装房”,路由、各种功能都内置好了;Koa 则是“硬装完毕的空房”,只提供了核心的请求处理能力,路由、请求体解析这些功能都需要你自己挑选中间件来装。房子虽小,但每一寸空间都由你掌控。

Koa 的核心理念是“小而美”:核心库只处理最本质的请求响应流程,其他能力全部通过中间件按需添加。

⚖️ Koa 与 Express 的区别

同样是写后端接口,两者有几个明显的差异:

对比项ExpressKoa
框架体积内置路由等功能核心精简,只处理请求响应
异步写法基于回调原生 async/await
路由内置需安装 @koa/router
请求处理reqres 两个对象封装成单个 ctx 上下文对象
中间件模型线性执行洋葱模型(后面会专门讲)

对初学者来说,记住一句话就够了:Express 开箱即用,Koa 更精简、写法更现代。上一门课程学的路由、中间件思想在 Koa 里完全通用,只是写法不同,所以学习成本很低。


🚀 初始化项目

新建一个文件夹 koa-demo,在终端进入该目录,初始化项目并安装 Koa:

mkdir koa-demo
cd koa-demo
npm init -y
npm install koa

本文及本课程的示例均基于 Node.js v22 LTS + Koa 3.2.1 编写和验证。Koa 3 全面拥抱 async/await,写法和旧版 Koa 2 基本一致,直接用新版即可。

为了使用 import 语法,在 package.json 中加一行 "type": "module"

package.json
{
    "name": "koa-demo",
    "version": "1.0.0",
    "type": "module",
    "dependencies": {
        "koa": "^3.2.1"
    }
}

🛠 Hello World

新建 app.js,写入下面的代码:

app.js
import Koa from 'koa';

const app = new Koa();

// 处理所有请求的中间件
app.use(async (ctx) => {
    ctx.body = 'Hello Koa';
});

app.listen(3000, () => {
    console.log('服务器已启动:http://localhost:3000');
});

逐行理解:

  • new Koa() 创建一个 Koa 应用实例,相当于 Express 里的 express()
  • app.use() 注册中间件,每个请求进来都会经过它。回调里的 ctx 是上下文对象,封装了这次请求和响应的所有信息。
  • ctx.body 就是要返回给客户端的内容,直接赋值即可,不需要像原生 http 那样调用 end()
  • app.listen(3000) 监听 3000 端口,启动服务。

在终端运行:

node app.js

浏览器打开 http://localhost:3000,就能看到 Hello Koa 了。开发时也可以用 node --watch app.js,保存文件后自动重启服务器。


💡 ctx.body 能返回什么

ctx.body 非常智能,你赋什么类型的值,它就自动设置对应的响应格式:

app.js
app.use(async (ctx) => {
    // 返回字符串
    ctx.body = '你好,Koa';
});
app.js
app.use(async (ctx) => {
    // 返回对象,自动转成 JSON,Content-Type 自动设为 application/json
    ctx.body = { name: '小明', age: 18 };
});

对比一下之前用原生 http 写 JSON 接口的繁琐步骤:手动 JSON.stringify、手动设置 Content-Type。这些 Koa 都帮我们做了,而且返回中文也不会乱码,编码问题框架自动处理好了。

实际开发中,接口返回对象(JSON)是主流场景。ctx.body = {...} 这一个赋值,就是我们用得最多的响应写法。

🧾 小节总结

  • Koa 是 Express 同一团队打造的轻量 Web 框架,核心精简,功能靠中间件扩展。
  • 相比 Express,Koa 原生支持 async/await,用 ctx 一个对象封装请求和响应。
  • 初始化项目:npm init -ynpm install koa,在 package.json 设置 "type": "module" 使用 ESM。
  • app.use() 注册中间件,ctx.body 赋值即返回内容,赋对象会自动转成 JSON。
  • node --watch app.js 启动开发,保存自动重启。

❓ 知识问答

Q1:学过 Express 还有必要学 Koa 吗?

有必要。两者思想相通,但 Koa 的 async/await 写法和洋葱模型更现代,很多新项目和框架(如一些 Node 服务端框架)都受它影响。学 Koa 能让你理解中间件更本质的运作方式。

Q2:Koa 没有内置路由,会不会很麻烦?

不麻烦。装一个官方路由库 @koa/router 就能用,写法和 Express 的路由几乎一样,后面会专门用一篇文章讲。

Q3:Koa 3 和 Koa 2 差别大吗?

日常写法基本一样,都是 async/await 风格。Koa 3 主要是内部升级、提高了 Node.js 版本要求,学习时直接用 Koa 3 即可。

Q4:ctx.body 赋了对象,响应头需要手动设置吗?

不需要。Koa 会根据值的类型自动设置 Content-Type,对象和数组会自动序列化为 JSON,这就是它比原生 http 方便的地方。


🧪 小练习

  1. 在你自己的 Koa 项目里,把返回内容改成一个 JSON 对象,包含你的名字和今天的日期。
app.js
import Koa from 'koa';

const app = new Koa();

app.use(async (ctx) => {
    // 请在这里编写代码
});

app.listen(3000);
  1. 用浏览器访问 http://localhost:3000,确认能看到 JSON 格式的返回结果。

🎉 恭喜你已经跑通了第一个 Koa 应用!下一篇我们深入 Koa 最核心的对象:Context 上下文,看看 ctx 里到底装了哪些好用的东西。