koa-router中提供两种方式注册路由:
具体的HTTP动词注册方式 , 例如:router.get('/users', ctx => {})
支持所有的HTTP动词注册方式 , 例如:router.all('/users', ctx => {})
2、http METHODS
源码中采用methods模块获取HTTP请求方法名 , 该模块内部实现主要依赖于http模块:
3、router.verb() and router.all()
这两种注册路由的方式的内部实现基本类似 , 下面以router.verb()的源码为例:
该方法第一部分是对传入参数的处理 , 对于middleware参数的处理会让大家联想到ES6中的rest参数 , 但是rest参数与arguments其中一个致命的区别:
rest参数只包含那些没有对应形参的实参 , 而arguments则包含传给函数的所有实参 。
如果采用rest参数的方式 , 上述函数则必须要求开发者传入name参数 。但是也可以将name和path参数整合成对象 , 再结合rest参数:
采用ES6的新特性 , 代码变得简洁多了 。
第二部分是register方法 , 传入的method参数的形式就是router.verb()与router.all()的最大区别 , 在router.verb()中传入的method是单个方法 , 后者则是以数组的形式传入HTTP所有的请求方法 , 所以对于这两种注册方法的实现 , 本质上是没有区别的 。
4、register
register方法主要负责实例化Layer对象、更新路由前缀和前置param处理函数 , 这些操作在Layer中已经提及过 , 相信大家应该轻车熟路了 。
5、use
熟悉Koa的同学都知道use是用来注册中间件的方法 , 相比较Koa中的全局中间件 , koa-router的中间件则是路由级别的 。
Router.prototype.use = function () {
koa-router中间件注册方法主要完成两项功能:
将路由嵌套结构扁平化 , 其中涉及到路由路径的更新和param前置处理函数的插入;
路由级别中间件通过注册一个没有method的Layer实例进行管理 。
五、路由匹配
match方法主要通过layer.match方法以及methods属性对layer进行筛选 , 返回的matched对象包含以下几个部分:
path: 保存所有路由路径被匹配的layer;
pathAndMethod: 在路由路径被匹配的前提下 , 保存路由级别中间件和路由请求方法被匹配的layer;
route: 仅当存在路由路径和路由请求方法都被匹配的layer , 才能算是本次路由被匹配上 。
另外 , 在ES7之前 , 对于判断数组是否包含一个元素 , 都需要通过indexOf方法来实现 , 而该方法返回元素的下标 , 这样就不得不通过与-1的比较得到布尔值:
而作者巧妙地利用位运算省去了“讨厌的-1” , 当然在ES7中可以愉快地使用includes方法:
六、路由执行流程
理解koa-router中路由的概念以及路由注册的方式 , 接下来就是如何作为一个中间件在koa中执行 。
koa中注册koa-router中间件的方式如下:
从代码中可以看出koa-router提供了两个中间件方法:routes和allowedMethods 。
推荐阅读
- dnf记忆之地在哪
- IE和Firefox之间在JavaScript语法上的差异
- 关于小I耳机插孔的解决办法
- 野性之皮图纸怎么弄
- 元气骑士死神之息有什么用
- 关于ET280手机重复的问题之我见
- 带你玩转577W视频播放
- 多普达585之常用设置
- 千金之裘非一狐之腋的意思
- 暗夜之神中如何摆摊交易