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.statusCoderes.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 函数作为中间件 - 以下截图具体项目流程