文章目录

前情概要

上文中的RouteHandler中有一个重要方法GetActionDescriptor没有贴代码和说,接下来我们就说一说这个方法。

使用controllerName、actionName、httpmethod获得唯一匹配的处理函数描述对象

直接上代码,看代码注释即可

//action注册缓存对象
let _dic_override = new Map<string, Map<string, ActionDescriptor>>();
//最终路由到action映射关系的缓存对象
let _dic_buid_routes: Map<string, Map<string, ActionDescriptor>>; export function GetActionDescriptor(controllerName: string, actionName: string, method?: string): ActionDescriptor | undefined {
//没有build过,则build一下。把路由到action的映射关系解析好
if (!_dic_buid_routes) build();
//获得controller描述对象
var c = _dic_buid_routes.get(controllerName)
if (!c)
return;
//从controller描述对象中获得对应action,先根据请求类型_action名称来获取,获取不到的情况下则直接用action名称来获取。
var a = c.get(actionName + (method ? '_' + method.toLowerCase() : ''));
if (!a)
a = c.get(actionName)
return a;
}
//对controller和action名称默认做小写处理。匹配的时候方便一点。url不区分大小写嘛。
//{"controllerName":{"post_addUser":{描述对象},"getuserinfo":{描述对象}}}。类似如此结构。
function build() {
_dic_buid_routes = new Map<string, Map<string, ActionDescriptor>>();
_dic_override.forEach((v, k, m) => {
if (v.size <= 0)
return;
var cname = '';
var aMap = new Map<string, ActionDescriptor>();
v.forEach((av, ak, am) => {
cname = av.ControllerName;
aMap.set(av.Id.toLowerCase(), av);
})
_dic_buid_routes.set(cname.toLowerCase(), aMap)
})
}

GetActionDescriptor方法中先检查是否build过,没有则build完成之后,根据对应规则查找相应的描述对象并返回,交给后续的中间件使用。

为什么需要ActionDescriptor对象。

请求处理函数描述对象保存了当前处理函数的一些基本信息,比如controllername的名称,所在类的名称,所在类的原型。函数的名称,请求中函数的别,函数的原型,请求方法的约束等基本信息

export class ActionDescriptor {
public ControllerType: any;
public ControllerTypeName: string;
public ControllerName: string;
public ActionType: any;
public ActionTypeName: string;
public ActionName: string;
public HttpMethod: string;
public Id: string;
public isAuth?: boolean;
}

为什么要使用httpmethod_actionname 的格式规定id字段。

  1. 使用id字段可以方便直接hash查找缓存的处理函数方法
  2. 使用httpmethod的主要原因是我们需要支持针对单个处理函数指定它只接收某一种httpmethod方式的请求。

    好比route.post('/path',(req,res,next)=>{});就只能处理post请求。

【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--路由限制及选择篇(2/8)【route】的更多相关文章

  1. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

    第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...

  2. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】

    http://www.cnblogs.com/powertoolsteam/p/MVC_three.html 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实 ...

  3. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  4. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  5. 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

  6. asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录

    MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api  注册全局异常过滤器的不同之处 using SuperManCore; using System. ...

  7. 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller

    原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...

  8. 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

    原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...

  9. 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性

    原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...

随机推荐

  1. solr搜索引擎配置使用mongodb作为数据源

    环境说明: 操作系统:由于是使用的docker直接拉取的镜像部署的,系统是LINUX环境 mongodb: 4.0.3 solr: 7.5.0 python: 3.5 配置mongodb 1.拉取mo ...

  2. js实现页面锚点定位动画滚动

    项目上需要的效果,个人不想用jquery实现,想着用js自己试试,花了点儿时间,终于实现.. 上干货.. function scrollTo(y, duration) { /*y:目标纵坐标,dura ...

  3. python第十二天 生成器,迭代器,内置函数

    第二模块学习:  生成器,迭代器,内置函数 生成器特点:只有在调用时才会生成相应的数据,运行的速度快! 示例: def fil(max):#斐波那契数 n,a,b=0,0,1 #定义初始数据 whil ...

  4. 如何以SYSTEM用户运行CMD

    有的时候有些文件在管理员账户不能删除,这个时候需要在SYSTEM用户下删除. 可以通过以SYSTEM权限运行CMD来删除某些文件或目录的目的. 1. 从微软网站下载PSTool. 2. 以管理员运行C ...

  5. 01LaTeX学习系列之---TeX的介绍与认识

    目录 01TeX的介绍与认识 目录 前言 (一)TeX 的宣传 TeX - Beauty and Fun 1. TeX 是什么? 2. TeX 是哪家公司生产的? 3. 我们今天主角的名字怎么念啊?& ...

  6. java.sql.SQLSyntaxErrorException: ORA-00904: "column": 标识符无效

    java.sql.SQLSyntaxErrorException: ORA-00904: "column": 标识符无效 首先查看无效的列是不是orcale关键字 , 如果不是 , ...

  7. CyclicBarrier源码解读

    1. 简介 JUC中的CyclicBarrier提供了一种多线程间的同步机制,可以让多个线程在barrier等待其它线程到达barrier.正如其名CyclicBarrier含义就是可以循环使用的屏障 ...

  8. SQL查询语句,怎样查询重复数据

    SQL查询语句,怎样查询重复数据 2012-02-22 14:50神奇的马骁勇 | 浏览 0 次 有表A, 中有字段id, name, memo现在有很多id重复的数据,怎么把这些重复的都查出来?gr ...

  9. 算法与cpu

    cpu中的控制单元对应算法中的控制: cpu重的计算单元对应算法中的顺序计算:

  10. Linux下rz/sz安装及使用方法

    新搞的云服务器用SecureCRT不支持上传和下载,没有找到rz命令.记录一下如何安装rz/sz命令的方法. 一.工具说明 在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz ...