Koa2框架学习基本语法和使用

Koa框架简介

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

安装

# 初始化package.json
npm init

# 安装koa2 
npm install koa

创建一个简单的web服务

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

app.use( async ( ctx,next ) => {
  ctx.body = 'hello world'
})

app.listen(3000)

级联

以下是官方文档中的一个例子

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

文档中给出的解释是:当请求开始时首先请求流通过 x-response-timelogging 中间件,然后继续移交控制给 response 中间件。当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件。当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为

简单来说,当执行的中间件中调用的next()方法,则会停止当前中间件的执行,而去执行下游的中间件,如果下游的中间件中也调用了next()方法,则也会停止执行继续执行下游的中间件,以此类推直到下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为

看一个简单的例子

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

// one

app.use(async (ctx, next) => {
  console.log("1");
  await next();
  console.log("2");
});

// two

app.use(async (ctx, next) => {
  console.log("3");
  await next();
  console.log("4");
});

// three

app.use(async (ctx) => {
  console.log("5");

  ctx.body = "Hello World";
});

app.listen(3000);

代码执行结果:1 3 5 4 2

执行顺序

  • 首先执行one中间件
  • 输出结果1后,遇到next()方法,停止执行,开始执行下游中间件
  • two中间件输出结果3后,再次遇到next()方法,停止执行,开始执行下游中间件
  • three中间件输出结果5后,执行完成,并且没有更多的下游中间件,开始恢复执行其上游行为,执行two中间件没有执行的代码。

上述过程也可以通过”洋葱模型“来解释中间件执行顺序

洋葱模型

Application对象

application是koa的实例 简写app

app.listen(…)

给创建的Koa应用程序绑定端口,以下是一个无作用的 Koa 应用程序被绑定到 3000 端口:

const Koa = require('koa');
const app = new Koa();
app.listen(3000);

app.use(function)

将给定的中间件方法添加到此应用程序。app.use() 返回 this, 因此可以链式表达.

app.use(someMiddleware)
app.use(someOtherMiddleware)
app.listen(3000)

等同于

app.use(someMiddleware)
  .use(someOtherMiddleware)
  .listen(3000)

app.on()

app.on()的作用是可以添加一个 “error” 事件侦听器,来对错误进行处理

app.on('error', err => {
  log.error('server error', err)
});

如果 req/res 期间出现错误,并且 无法 响应客户端,Context实例仍然被传递:

app.on('error', (err, ctx) => {
  log.error('server error', err, ctx)
});

上下文(Context)

Koa Context 将 node 的 requestresponse 对象封装到单个对象中,每个_ 请求都将创建一个 Context,并在中间件中作为接收器引用,标识符为 ctx

app.use(async ctx => {
  ctx; // 这是 Context
  ctx.request; // 这是 koa Request
  ctx.response; // 这是 koa Response
});

ctx.req

Node 的 request 对象.

ctx.res

Node 的 response 对象.

注意

绕过 Koa 的 response 处理是 不被支持的. 应避免使用以下 node 属性:

  • res.statusCode
  • res.writeHead()
  • res.write()
  • res.end()

ctx.request

koa 的 Request 对象.

ctx.response

koa 的 Response 对象.


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!