Koa-Router 源码解析
Talk is cheap, show me the code
koa-router
打开源码目录,就涉及两个重要文件,layer.js和router.js,分别对应Router和Layer对象
Layer对象是对单个路由的管理,其中包含的信息有路由路径(path)、路由请求方法(method)和路由执行函数(middleware),并且提供路由的验证以及params参数解析的方法。
Router对象则是对所有注册路由的统一处理,并且它的API是面向开发者的。
分析koa-router的实现原理可以从以下几个方面入手:
- Layer对象的实现
- 路由注册
- 路由匹配
- 路由执行流程
Router
路由注册
- 用到的库
|
|
- Router构造函数
|
|
前者用来保存param前置处理函数,后者用来保存实例化的Layer对象。并且这两个属性与接下来要讲的路由注册息息相关。
koa-router中提供两种方式注册路由:
- 具体的HTTP动词注册 router.get(‘/users’, ctx => {})
- 支持所有的HTTP动词注册方式 router.all(‘/users’, ctx => {})
HTTP METHODS
源码中用methods模块获取http请求方法名
methods
源码很短 如下:
|
|
就是返回了http的methods
注册路由
router.verb()和router.all() 动词和所有
以动词方式为例:
|
|
其中,对于参数处理, 采用arguments的方式,类比ES6中rest参数方式
rest参数只包含那些没有对应形参的实参,而arguments则包含传给函数的所有实参。
看下register函数
|
|
register方法主要用来实例化Layer对象,设置前缀,前置param处理函数。
.use方法
Koa中use方法是注册中间件用的,这里的use则是路由级别的。
|
|
.match方法 路由匹配
|
|
- path 保存所有路由路径被匹配的layer;
- pathAndMethod: 在路由路径被匹配的前提下,保存路由级别中间件和路由请求方法被匹配的layer;
- route: 仅当存在路由路径和路由请求方法都被匹配的layer,才能算是本次路由被匹配上。
路由执行
koa中如何使用koa-router,用过的应该都知道。
|
|
这里出现了两个方法 routes和allowedMethods,我们来看一下这俩个的实现源码。
allowedMethods
|
|
allowedMethods中间件主要用于处理options请求,响应405和501状态。
routes
|
|
Conclusion
koa-router可总结为如下: