Koa
koa官网 http://koajs.cn
初始化
1 | npm init -y |
不管看什么源码 第一步 node_modules/koa/package.json 找package.json文件,找里面的main 这里是 “main”: “lib/application.js”, 然后再去lib找 application.js
使用
1 | // 1.helloword.js |
Context 上下文 http://koajs.cn/#-context-
手写Koa原理
新建文件夹koa koa/application.js
1 | // 2.server.js |
application.js
1 | // ./koa/application.js |
功能上基本类似 但是 2.server.js line5这里不是req、res 而是ctx 如下:
新建 context.js request.js response.js
1 | // context.js |
1 | // request.js |
1 | // response.js |
1 | // 2.server.js |
1 | // ./koa/application.js |
request.js
1 | // request.js 是扩展request属性 |
context.js
1 | // context.js 代理功能 |
现在 2.server.js line22又增加了一个path属性,也需要代理, 统一封装,如下:
1 | // context.js |
下一部分 2.server.js
1 | // 2.server.js |
response.js
1 | // response.js |
context.js
1 | // context.js |
中间件
Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的。
next
3.helloword.js
1 | // 3.helloword.js |
组合成了一个大的函数 相当于如下:
1 | // 3.helloword.js |
如图:

这个叫中间件 我可以在执行某个过程中 之前增加某些逻辑
中间件 use方法 它可以决定是否向下执行(调next就向下走)
这里可以使用async+await方法
1】
1 | // 3.helloword.js |
2】
1 | // 3.helloword.js |
分析: 1 , line14的next() 就是line17-22
1 | async (ctx,next) => { |
这个方法 =>2, next()没有等待执行完 所以 =>4 logger =>3=>6=>5
3】
1 | // 3.helloword.js |
浏览器获取到服务端返回的 ‘hello4’ 因为这里line16 next()方法外层已经执行完了,所以服务器端返回
4】
1 | // 3.helloword.js |
这样就会等待 next() 这个函数完全执行完再返回 hello4
执行: 浏览器会过1秒之后再返回
5】
1 | // 3.helloword.js |
在使用koas时如果遇到next 前面就可以加 return 或者await
koa里面有个compose方法 会将所有方法组合成一个大的promise 如果没有加如上的return 或者async await 代码可能没有执行完就返回了
6】
计算执行的时间
1 | // 3.helloword.js |
完善
现在看 ./koa/application 方法整合
手写compose方法
1 | // 4.helloword.js 引入自己的application.js |
1 | // application.js |