之前实现了一个简单的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. 每周一练 之 数据结构与算法(Stack)

    最近公司内部在开始做前端技术的技术分享,每周一个主题的 每周一练,以基础知识为主,感觉挺棒的,跟着团队的大佬们学习和复习一些知识,新人也可以多学习一些知识,也把团队内部学习氛围营造起来. 我接下来会开 ...

  2. 开启mode="history"模式,需要服务端的支持,因为出现“刷新页面报错404”的问题;

    mode="history"是去除链接中的'#'的,但是加上后页面刷新回报404错误,怎么办呢? 解决办法:只需要在nginx中最末尾加上 try_files $uri $uri/ ...

  3. vue click.stop阻止点击事件继续传播

    <div id="app"> <div @click="dodo"> <button @:click="doThis&q ...

  4. 《Java基础知识》序列化与反序列化详解

    序列化的作用:为了不同jvm之间共享实例对象的一种解决方案.由java提供此机制. 序列化应用场景: 1. 分布式传递对象. 2. 网络传递对象. 3. tomcat关闭以后会把session对象序列 ...

  5. Java使用ObjectMapper做数据转换的常用工具类实现

    1.介绍 ObjectMapper类是Jackson库的主要类,它提供一些功能将数据集或对象转换的实现 2.依赖包 <!-- https://mvnrepository.com/artifact ...

  6. 从零开始学.net core(一)

    https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.0

  7. SQL数据库基础

    SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...

  8. electron初探问题总结

    使用electron时间不是很久,随着使用的深入慢慢的也遇到一些问题,下面总结一下遇到的问题与大家分享,避免趟坑. 主要问题汇总如下: webview与渲染进程renderer间通信 BrowserW ...

  9. .NET Core 轻量级模板引擎 Mustachio

    一. 前言 Mustachio 是一款轻量级且强大的模板引擎,可以用在网页渲染.代码生成器等需要模板引擎的场景.我用它是用在配置文件模板化的场景,在配置文件里面编写一些模板语法,然后从 Cloud 拉 ...

  10. Maven发布封装到中央仓库时候报错:no default secret key: No secret key

    今天因为发布swagger-spring-boot-starter做一个问题的修复,然后碰到了下面这个问题,记录一下解决过程,帮助后续碰到类似问题的童鞋: *gpg: WARNING: "- ...