博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--路由限制及选择篇(2/8)【route】...
阅读量:6257 次
发布时间:2019-06-22

本文共 1986 字,大约阅读时间需要 6 分钟。

前情概要

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

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

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

//action注册缓存对象let _dic_override = new Map
>();//最终路由到action映射关系的缓存对象let _dic_buid_routes: Map
>;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
>(); _dic_override.forEach((v, k, m) => { if (v.size <= 0) return; var cname = ''; var aMap = new Map
(); 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请求。

转载地址:http://iexsa.baihongyu.com/

你可能感兴趣的文章
centos7上修改主机名
查看>>
样式技巧总结
查看>>
python 获取当前ip
查看>>
plsql developer中,清除登录历史
查看>>
mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?...
查看>>
Json、JavaBean、String等互转
查看>>
Python-列表
查看>>
多线程
查看>>
[CF949C]Data Center Maintenance
查看>>
增强for循环的使用详解及代码
查看>>
程序员优化程序流程
查看>>
6 ZigZag Conversion
查看>>
[react-router] 平时积累
查看>>
强类型数据集
查看>>
使用python处理selenium中的获取文本问题
查看>>
LinearLayout布局
查看>>
java 的 (PO,VO,TO,BO,DAO,POJO) 解释
查看>>
基本计数方法
查看>>
Mock.js:前后端分离开发工具
查看>>
内容循环滚动的表格
查看>>