Skip to content

KOA

最早是cjs,文档也是;现在已经完全兼容esm了;

  • new Koa() 的 app 只有在 listen 的时候才创建 HTTP Server;

  • use fn 的时候,传入的一个函数会被压入到中间件队列,像洋葱的一层层皮一样逐级进入逐级穿出

  • Koa 支持对 Buffer/String/JSON/Stream 数据类型的直接响应

js
// 1. String 类型响应
app.use(async ctx => {
  ctx.body = 'Hello World';  // 直接返回字符串
});

// 2. Buffer 类型响应
app.use(async ctx => {
  ctx.body = Buffer.from('Hello World');  // 直接返回 Buffer
});

// 3. JSON 类型响应
app.use(async ctx => {
  ctx.body = {  // 直接返回对象,Koa 会自动转换为 JSON
    name: 'John',
    age: 30
  };
});

// 4. Stream 类型响应
app.use(async ctx => {
  const fs = require('fs');
  ctx.body = fs.createReadStream('file.txt');  // 直接返回流
});
  • 上下文 context 是在 Node 原生的 request 进入也就是异步回调执行的时候才创建,不是一开始创建好的,所以每个请求都有独立的上下文,自然不会互相污染
js
// 当请求进来时
app.use(async (ctx) => {
  // 这里的 ctx 是 Koa 为这个请求新创建的上下文
  // 每个请求都会得到一个新的 ctx 对象
  console.log(ctx.request.url);
});
  • 创建好的上下文,Koa 会把它们跟原生,以及请求和响应之间,建立各种引用关系,方便在业务代码和中间件中使用,也就是 createContext 里面所干的事情
js
app.use(async (ctx) => {
  // ctx 包含了多个重要引用:
  
  // 1. 原生 Node.js 的请求对象
  ctx.req;  // Node.js 原生 request
  
  // 2. Koa 封装的请求对象
  ctx.request;  // Koa 的 request 对象
  
  // 3. 原生 Node.js 的响应对象
  ctx.res;  // Node.js 原生 response
  
  // 4. Koa 封装的响应对象
  ctx.response;  // Koa 的 response 对象
  
  // 5. 状态码
  ctx.status;
  
  // 6. 响应体
  ctx.body;
});
本站访客数 人次 本站总访问量