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

简介: 文章目录前情概要上文中的RouteHandler中有一个重要方法GetActionDescriptor没有贴代码和说,接下来我们就说一说这个方法。使用controllerName、actionName、httpmethod获得唯一匹配的处理函数描述对象直接上代码,看代码注释即可//acti...

文章目录

前情概要

上文中的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请求。
目录
相关文章
|
30天前
|
API 数据库 数据安全/隐私保护
利用Django框架构建高效后端API服务
本文将介绍如何利用Django框架构建高效的后端API服务。通过深入分析Django框架的特性和优势,结合实际案例,探讨了如何利用Django提供的强大功能来构建高性能、可扩展的后端服务。同时,还对Django框架在后端开发中的一些常见问题进行了解决方案的探讨,并提出了一些建设性的建议。
51 3
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
27 0
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(上)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
29 0
|
3月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
86 7
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(下)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
25 0
|
5月前
|
缓存 JavaScript 前端开发
Vue之路由及Node.js环境搭建(一起探索新事物)
Vue之路由及Node.js环境搭建(一起探索新事物)
61 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
99 5
|
2月前
|
SQL 安全 数据库
利用Django框架构建高效后端应用
【2月更文挑战第9天】在当今互联网时代,后端开发扮演着至关重要的角色。本文将介绍如何利用Django框架构建高效的后端应用,探讨其优势和应用场景,并深入探讨了Django框架的核心特性和功能。
|
3月前
|
负载均衡 前端开发 Java
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
127 0