Skip to content
On this page

Koa快速入门

Koa是由Express原班人马打造的新一代Web框架,致力于成为更小、更富有表现力、更健壮的Web框架。通过利用async函数,Koa让你摆脱回调地狱,并极大地简化了错误处理。

安装Koa

创建项目

首先创建一个新的Node.js项目并安装Koa:

bash
mkdir my-koa-app
cd my-koa-app
npm init -y
npm install koa

基本服务器

创建一个最简单的Koa服务器:

javascript
// app.js
const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World';
});

app.listen(3000);
console.log('Server running on port 3000');

运行服务器:

bash
node app.js

Koa vs Express对比

Koa与Express的主要区别在于:

  • 异步处理:Koa原生支持async/await,而Express主要基于回调
  • 中间件模型:Koa使用洋葱模型,Express使用线性模型
  • 体积:Koa核心更小,功能通过中间件扩展
  • 上下文:Koa将req和res合并为ctx对象

基本中间件

Koa的中间件采用函数形式,接收ctx和next参数:

javascript
const Koa = require('koa');
const app = new Koa();

// 最简单的中间件
app.use(async (ctx, next) => {
  console.log('A');
  await next();
  console.log('A end');
});

app.use(async (ctx, next) => {
  console.log('B');
  await next();
  console.log('B end');
});

app.use(async ctx => {
  console.log('Response');
  ctx.body = 'Hello Koa';
});

app.listen(3000);
// 输出: A -> B -> Response -> B end -> A end

上下文(Context)对象

Koa将Node.js的request和response对象封装到单独的context对象中:

javascript
app.use(async ctx => {
  // ctx.request 和 ctx.response 是Koa的请求和响应对象
  // ctx.req 和 ctx.res 是Node.js的原生对象
  
  // 常用属性
  console.log(ctx.method);    // HTTP方法
  console.log(ctx.url);       // URL
  console.log(ctx.path);      // 路径
  console.log(ctx.query);     // 查询参数
  console.log(ctx.headers);   // 请求头
  
  // 响应设置
  ctx.body = 'Response body';  // 设置响应体
  ctx.status = 200;           // 设置状态码
  ctx.type = 'text/html';     // 设置内容类型
});

路由处理

Koa本身不提供路由功能,但可以使用koa-router中间件:

bash
npm install @koa/router
javascript
const Koa = require('koa');
const Router = require('@koa/router');
const app = new Koa();
const router = new Router();

// GET路由
router.get('/', async (ctx) => {
  ctx.body = 'Home page';
});

router.get('/users/:id', async (ctx) => {
  ctx.body = `User ID: ${ctx.params.id}`;
});

// POST路由
router.post('/users', async (ctx) => {
  ctx.body = 'Create user';
});

app.use(router.routes());
app.listen(3000);

请求体解析

Koa需要中间件来解析请求体:

bash
npm install koa-bodyparser
javascript
const Koa = require('koa');
const Router = require('@koa/router');
const bodyParser = require('koa-bodyparser');

const app = new Koa();
const router = new Router();

app.use(bodyParser());

router.post('/users', async (ctx) => {
  const { name, email } = ctx.request.body;
  ctx.body = { name, email };
});

app.use(router.routes());
app.listen(3000);

静态文件服务

使用koa-static中间件提供静态文件服务:

bash
npm install koa-static
javascript
const Koa = require('koa');
const serve = require('koa-static');

const app = new Koa();

// 提供public目录下的静态文件
app.use(serve('./public'));

app.listen(3000);

错误处理

Koa提供了全局错误处理机制:

javascript
const app = new Koa();

app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = { message: err.message };
    console.error(err);
  }
});

app.use(async (ctx) => {
  if (ctx.path === '/error') {
    throw new Error('Something went wrong');
  }
  ctx.body = 'OK';
});

app.listen(3000);

常用中间件

日志中间件

javascript
const logger = async (ctx, next) => {
  const start = Date.now();
  await next();
  const ms = Date.now() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
};

app.use(logger);

CORS中间件

bash
npm install @koa/cors
javascript
const cors = require('@koa/cors');

app.use(cors());

推荐的项目结构

my-koa-app/
├── package.json
├── app.js
├── middleware/
│   ├── logger.js
│   └── error-handler.js
├── routes/
│   ├── index.js
│   └── user.js
├── controllers/
│   └── user-controller.js
├── models/
│   └── user.js
├── public/
│   ├── css/
│   └── js/
└── config/
    └── index.js

环境配置

使用环境变量管理配置:

javascript
const port = process.env.PORT || 3000;
const env = process.env.NODE_ENV || 'development';

这个快速入门涵盖了Koa的核心概念,接下来可以深入了解中间件系统、路由管理等高级特性。