一、前言

Koa为了保持自身的简洁,并没有捆绑中间件。但是在实际的开发中,我们需要和形形色色的中间件打交道,本文将要分析的是经常用到的路由中间件 -- koa-router。
如果你对Koa的原理还不了解的话,可以先查看Koa原理解析。
二、koa-router概述
koa-router的源码只有两个文件:router.js和layer.js,分别对应Router对象和Layer对象。
Layer对象是对单个路由的管理,其中包含的信息有路由路径(path)、路由请求方法(method)和路由执行函数(middleware),并且提供路由的验证以及params参数解析的方法。
相比较Layer对象,Router对象则是对所有注册路由的统一处理,并且它的API是面向开发者的。
接下来从以下几个方面全面解析koa-router的实现原理:
- Layer对象的实现
- 路由注册
- 路由匹配
- 路由执行流程
三、Layer
Layer对象主要是对单个路由的管理,是整个koa-router中最小的处理单元,后续模块的处理都离不开Layer中的方法,这正是首先介绍Layer的重要原因。
function Layer(path, methods, middleware, opts) {
this.opts = opts || {};
// 支持路由别名
this.name = this.opts.name || null;
this.methods = [];
this.paramNames = [];
// 将路由执行函数保存在stack中,支持输入多个处理函数
this.stack = Array.isArray(middleware) ? middleware : [middleware];
methods.forEach(function(method) {
var l = this.methods.push(method.toUpperCase());
// HEAD请求头部信息与GET一致,这里就一起处理了。
if (this.methods[l-1] === 'GET') {
this.methods.unshift('HEAD');
}
}, this);
// 确保类型正确
this.stack.forEach(function(fn) {
var type = (typeof fn);
if (type !== 'function') {
throw new Error(
methods.toString() + " `" + (this.opts.name || path) +"`: `middleware` "
+ "must be a function, not `" + type + "`"
);
}
}, this);
this.path = path;
// 1、根据路由路径生成路由正则表达式
// 2、将params参数信息保存在paramNames数组中
this.regexp = pathToRegExp(path, this.paramNames, this.opts);
};另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
新闻标题:玩转Koa之koa-router原理解析-创新互联
标题URL:http://www.jxjierui.cn/article/cshhpo.html


咨询
建站咨询
