node之koa2的实践

1,049 阅读2分钟

koa2定义

Koa 通过 node.js 实现了一个十分具有表现力的 HTTP 中间件框架,力求让 Web 应用开发和 API 使用更加地愉快。Koa 的中间件之间按照编码顺序在栈内依次执行,允许您执行操作并向下传递请求(downstream),之后过滤并逆序返回响应(upstream)。

几乎所有 HTTP 服务器通用的方法都被直接集成到 Koa 大约千行源码的代码库中。其中包括内容协商,节点不一致性的规范化,重定向等等操作。

Koa没有捆绑任何中间件。

特点

koa2与koa1的最大区别是koa2实现异步是通过async/await,koa1实现异步是通过generator/yield,

koa2中间件

Koa 是一个中间件框架,可以采用两种不同的方法来实现中间件:

  • async function (目前选用的)
  • common function
// ### async functions (node v7.6+)
//ctx:上下文,核心对象
//next:将处理的控制权转交给下一个中间件
app.use(async (ctx, next)=>{
  //...
  await next()    //等待下个中间件运行结束,才运行当前中间件的后续代码
  //...
})
// ### Common function
// 中间件通常带有两个参数 (ctx, next), ctx 是一个请求的上下文(context),
// next 是调用执行下游中间件的函数. 在代码执行完成后通过 then 方法返回一个 Promise.
app.use((ctx, next) => {
  const start = Date.now();
  return next().then(() => {
    const ms = Date.now() - start;
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
  });
});

1.ctx

每个中间件都接收一个 Koa 的 Context 对象,该对象封装了一个传入的 http 消息,并对该消息进行了相应的响应。 ctx 通常用作上下文对象的参数名称。

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 对象.

ctx.body = ctx.res.body = ctx.response.body

2.next()

当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件。当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为。

对于前端开发者而言,整个流程我们可以有两种理解:

第一种

  • 捕获阶段  next(); 之前的任意代码
  • 目标阶段  到达目标controller
  • 冒泡阶段 next(); 之后的任意代码 第二种 多个中间件会形成一个栈结构(middle stack),以"先进后出"(first-in-last-out)的顺序执行。

我们使用 async 函数作为中间件 - 以下截图具体项目流程

image.png

image.png image.png