之前实现了一个简单的WebServer

但是这离实际使用还有一点距离

webserver 首先面对第一个问题是路由表

啥是路由表

路由表别看听起来神秘,但是其实就是 if else

onhttp…

{

if(req.url.pathname =="/test1")

。。。

if(req.url.pathname ==”/test2”)

}

当然我们不可能这样写

让我们定义一个http请求处理器接口IHandle,然后弄个HandleList做容器

然后根据http请求找到同名路由表对象,跳过去。

当然我们只实现了最常见的一种路由表,根据pathname跳转

实际上99%的路由表都是这一种,还有一点点根据query参数的路由表,用的不多。

路由表的自动注册

既然有了HandleList,当然可以这样注册Handle

HandleList.AddHandle(“/test1”,new Handle_Test1());

其实我是比较倾向这样的手动注册的,我主张让代码关系体现在代码上。

但是有没有办法自动化的实现路由表呢,其实只可以在适当的条件下自动化,这只是个探索。

1.使用装饰器

这里我们利用的是js的装饰器特性

就是这个@开头的东西,这个东西怎么实现自动化注册呢?

因为它可以自动执行,只要载入这个class所在的文件,他的类装饰器就可以偷偷的执行代码,还能访问这个类的构造器。

如图,这是装饰器的代码,我们碰到装饰器执行就把这个对应的类new 一个,丢进handlelist里面。

2.触发载入文件

可能你会问,我怎么载入文件呢,不都是nodejs自动判断的吗?

这样干,在commonjs环境,require函数会载入对应的文件,当然你如果想要自动化的彻底一点,可以写个工具自动生成这个文件,那么不就实现全自动了吗?

当require 一个文件,他被加载(无论你require多少次,只会载入一次),所有的装饰器被执行。

虽然载入时机没有特别的需求,我还是决定等httpserver启动以后,再初始化他们

webserver启动不是立即的,listen的回调函数是http服务打开后执行,你可以把需要等待http启动后初始化的东西放在这里执行。

效果

这个程序的效果是

半自动的注册了路由表,我们一个手动的AddHanle也没有写。

这不是我喜欢的方式,但是很多人喜欢,我的目标就是告诉你装饰器如何实现这个半自动过程,再碰到类似的程序,你就一下看懂了

现在执行http://localhost:8080/test1你就可以看到效果了

只有test1 会执行Handle_Test1,这就是路由表

代码见https://gitee.com/lightsever/nodejs_study

typescript与nodejs(二)基于装饰器实现路由表的更多相关文章

  1. TS 自学笔记(二)装饰器

    TS 自学笔记(二)装饰器 本文写于 2020 年 9 月 15 日 上一篇 TS 文章已经是很久之前了.这次来讲一下 TS 的装饰器. 对于前端而言,装饰器是一个陌生的概念,但是对于 Java.C# ...

  2. Python笔记·第十一章—— 函数 (二) 装饰器

    一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...

  3. 接口测试基础——第7篇 简单的Python知识普及(二)之装饰器

    今天我们来学习python里面的“装饰器” 1.我在函数test运行前想先打印一些内容怎么办? def func(param):    print u"打印的内容"    para ...

  4. python高级 之(二) --- 类装饰器

    装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...

  5. Python进阶内容(二)--- 装饰器

    谈装饰器前,需要明白一件事,Python 中的函数和 Java.C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如: def foo(): print(" ...

  6. 【Python学习之二】装饰器

    装饰器 首先,给出装饰器的框架: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return ...

  7. 从C#到TypeScript - 装饰器

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...

  8. python 二——函数、装饰器、生成器、面向对象编程(初级)

    本节内容 1.函数 2.装饰器 3.生成器 4.类 一.函数 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 函数式 ...

  9. django之基于cookie和装饰器实现用户认证

    示例1 # Create your views here. user = "a" pwd = "a" def login(request): if reques ...

随机推荐

  1. Python3 并发编程1

    目录 操作系统发展 穿孔卡片 批处理 多道技术(单核) 并发与并行 进程 程序与进程 进程调度 进程的三个状态 同步和异步 阻塞与非阻塞 僵尸进程与孤儿进程 守护进程 Python中的进程操作 Pro ...

  2. 【Canvas】311- 解决 canvas 在高清屏中绘制模糊的问题

    点击上方"前端自习课"关注,学习起来~ 一.问题分析 使用 canvas 绘制图片或者是文字在 Retina 屏中会非常模糊.如图: 因为 canvas 不是矢量图,而是像图片一样 ...

  3. Docker--DockerFile创建自己的image

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 在我们 ...

  4. hikari连接池属性详解

    hikari连接池属性详解 一.主要配置 1.dataSourceClassName 这是DataSourceJDBC驱动程序提供的类的名称.请查阅您的特定JDBC驱动程序的文档以获取此类名称,或参阅 ...

  5. re常用模块

    re模块:从字符串里面找到特定的字符串 re的基本语法(匹配规则) import re s = '王大炮打炮被大炮打死了 王大炮打炮被大炮打死了' ^:开头 print(re.findall('^王大 ...

  6. 在命令提示符下,运行Java程序时,提示"找不到或无法加载主类"

    小白:在命令提示符下,运行Java程序时,提示"找不到或无法加载主类". 大神:运行Java程序的作用是让Java解释器装载,检验并运行字节码文件(.class).因此,在运行Ja ...

  7. java基础练习题

    1变量.运算符和类型转换:1.1手动输入一个学生的成绩,对这个成绩进行一次加分,加当前成绩的20%,输出加分后成绩 Scanner scan = new Scanner(System.in); Sys ...

  8. oracle 字符串转为数字排序

    select * from user order by  to_number(dept_id) asc

  9. 7款Chrome去广告插件

     互联网时代,大家都习惯在电脑或手机上查阅信息.观看视频.遇到不知道的东西,百度一下:想看的电视剧,爱奇艺腾讯A站B站搜一下.整个操作十分简单,大到八九十岁的老人,小到几岁孩子,都能做到.然而,很多时 ...

  10. Java集合内容

    Java的集合类定义在java.util包中,支持泛型,主要提供了3种集合类,包括List,Set和Map.Java集合使用统一的Iterator遍历. 1.List遍历 实现了Iterator接口的 ...