之前实现了一个简单的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. Vue中实现聊天窗口overflow:auto自动滚动到底部,实现显示当前最新聊天消息

    在做消息的项目,当有新消息的时候让新消息出现在最底部,此时的box用的是overflow:auto 注意:vue项目需要注意在dom结构渲染完再进行操作 <div class="mai ...

  2. JVM垃圾收集器CMS和G1

    CMS(Concurrent Mark Sweep)收集器是一种以获取 最短回收停顿时间 为目标的收集器.采用的是"标记-清除算法",整个过程分为4步 由于整个过程中,并发标记和并 ...

  3. 【hibernate】自定义转换器

    [hibernate]自定义转换器 转载:https://www.cnblogs.com/yangchongxing/p/10398255.html 1.转换基本属性 package cn.ycx.s ...

  4. 安卓逆向基础(001)-APK安装流程

    1.在/data/app下以报名为文件夹名新建文件夹 APK包存放在这里 以及lib文件 存放so 2./data/dalvik-cache 存放dex dex是dalvik虚拟机可执行文件 3./d ...

  5. HttpRunner学习6--使用parameters参数化

    前言 在使用HttpRunner测试过程中,我们可能会遇到这种场景: 账号登录功能,需要输入用户名和密码,设计测试用例后有 N 种组合情况 如果测试组合比较少,比如只有2个,那我们直接在YAML脚本中 ...

  6. filezilla无法登陆ubuntu虚拟机

    一般情况下,是新安装的虚拟机没有安装ssh造成的 进入虚拟机控制台,输入 sudo apt-get openssh-server 回车 等安装完成即可登陆.

  7. Angular 彻底解决 Dropdown 在 Safari 上无法自动关闭的问题

    之前在 Safari 上用 focus 事件来实现 Dropdown 下拉菜单,结果在 iOS 上不兼容. 尝试了 MDN 和 stack over flow 上各种奇技淫巧,然而在 iOS 上全都败 ...

  8. VS2019 开发Django(六)------Admin中图片上传

    导航:VS2019开发Django系列 该篇继续完善在Django的管理界面上传图片,因为LazyOrders小程序中菜单需要展示图片,而不是一个文本路径,所以我们还需要继续改造一下. 1)安装pil ...

  9. SpringSession 独立使用

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  10. finger

    finger <username> 显示用户信息,包括用户的home目录,上一次登录的时间,默认shell等 finger XXXXX #输出: #Login: XXXXX Name: X ...