【Koa】初识 Koa

1. Koa 特点

1.1 更好的处理异步

Koa 的核心设计是基于 async/await 异步编程模型。这使得 Koa 可以更好地处理异步操作,相比于传统的回调方式,代码更清晰且更易于维护。

1.2 无内置中间件

与 Express 不同,Koa 并没有内置任何中间件,如路由、模板引擎等。Koa 提供了一个极简的核心,可以根据自己的需求添加中间件(插件)。

1.3 洋葱模型中间件

Koa 中的中间件采用了“洋葱模型”,这意味着请求通过一系列中间件层的方式处理,每个中间件都可以在请求向下传递之前做一些事情,并且在响应返回时再做处理。这种结构非常适合处理日志记录、权限验证、错误处理等情况。

并且由于洋葱模型和异步的优化,解决了 express 潜在的异步问题。

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

// Logger 中间件
app.use(async (ctx, next) => {
  console.log(`${ctx.method} ${ctx.url}`);
  await next(); // 传递到下一个中间件
});

// 响应中间件
app.use(async ctx => {
  ctx.body = 'Hello Koa';
});

app.listen(3000);
console.log('Server running on http://localhost:3000');

express 潜在的回调问题:

在这里插入图片描述

而如果使用 koa,则会正常输出 1,2,3,4 ,主要原因是对于 async await 的支持。

可以看到,对于每个中间件,在完成了一些事情后,可以非常优雅的将控制权传递给下一个中间件,并能够等待它完成,当后续的中间件完成处理后,控制权又回到了自己,这种中间件模型称之为洋葱模型。

在这里插入图片描述

2. 核心概念

2.1 Context (ctx)

Koa 中的每个 HTTP 请求都会生成一个 Context 对象,简称 ctxctx 对象整合了 requestresponse(为原生 req, res 的二次封装),开发者可以通过 ctx 来读取请求信息和设置响应数据。

  • ctx.request: 处理请求的详细信息,如请求头、请求体、查询参数等。
  • ctx.response: 处理响应的详细信息,如状态码、响应头、响应体等。
app.use(async ctx => {
  ctx.body = 'This is the response body'; // 设置响应内容
  ctx.status = 200; // 设置响应状态码
});

为了方便使用,Koa将request和response中的很多成员提取到了context中,并使用访问器控制。

2.2 中间件

Koa 的中间件是一个 async 函数,可以使用 await next() 来控制请求传递给下一个中间件。由于采用了 async/await,错误处理可以使用标准的 try/catch 结构。

app.use(async (ctx, next) => {
  try {
    await next(); // 调用下一个中间件
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = 'Internal Server Error';
    console.error('Error occurred:', err);
  }
});
2.3 错误处理

Koa 提供了内置的错误处理机制,可以在中间件中捕获错误。由于 Koa 主要基于 async/await,你可以轻松地用 try/catch 捕获异步代码中的异常。

app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = 'Something went wrong';
  }
});

koa 内部也提供了错误的注册:

// 注册
app.on("error", function(e) { console.log(e) } )
// 使用
app.use(function(ctx, next) {
	// ...
	ctx.throw(403, "you have no permission");
	next();
})
2.3 API

见文档,都写的非常清楚。Koa API

2.4 cookie

在这里插入图片描述

2.5 自定义空间

有时,某些中间件希望添加一些额外的信息,以方便后续中间件处理,比如当前登录的用户信息。

Koa建议把这些信息添加到ctx.state中该属性默认是一个空对象,专门提供给中间件开发者添加额外信息的。

3. 常见中间件

虽然 Koa 本身没有内置路由或其他功能,但有很多第三方中间件可用:

3.1 路由 (@koa/router)

Koa 官方推荐使用 @koa/router 来处理路由。它是对 koa-router 的封装。

const Koa = require('koa');
const Router = require('@koa/router');
const app = new Koa();
const router = new Router({prefix: '/user'});

router.get('/', ctx => {
  ctx.body = 'Hello World!';
});

app.use(router.routes());
app.listen(3000);
3.2 静态文件服务 (koa-static)

可以使用 koa-static 来提供静态文件服务,比如 CSS、JS 文件等。

const serve = require('koa-static');
app.use(serve('./public'));
3.3 请求体解析 (koa-body)

要处理 POST 请求中的表单、 JSON 数据 或者多文件上传,可以使用 koa-body、它是对 koa-bodyparser 、koa-multer 等的封装。

const Koa = require('koa')
const { koaBody } = require('koa-body');
const app = new Koa()

app.use(koaBody())

app.use(async ctx => {
  console.log(ctx.request.body); // 获取 POST 请求的 body 数据
  ctx.body = 'Data received';
});

在这里插入图片描述

4. Koa 与 Express 的对比

  • 中间件处理: Koa 中间件基于 async/await,Express 依赖回调。
  • 灵活性: Koa 没有内置的路由或静态文件服务,需要通过第三方库添加;Express 则自带这些功能。
  • 上下文对象: Koa 使用 ctx 对象统一处理请求和响应,而 Express 分别使用原生的 reqres

express:

在这里插入图片描述

koa:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秀秀_heo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值