typescript与nodejs(二)基于装饰器实现路由表
之前实现了一个简单的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(二)基于装饰器实现路由表的更多相关文章
- TS 自学笔记(二)装饰器
TS 自学笔记(二)装饰器 本文写于 2020 年 9 月 15 日 上一篇 TS 文章已经是很久之前了.这次来讲一下 TS 的装饰器. 对于前端而言,装饰器是一个陌生的概念,但是对于 Java.C# ...
- Python笔记·第十一章—— 函数 (二) 装饰器
一 为何要用装饰器 有的时候写完一段代码,过段时间需要对它进行升级.添加一些新功能,但是如果要直接修改原来的代码会影响其他人的调用,所以就需要一个不修改源代码且不修改原函数的调用方式的东西又能为原函数 ...
- 接口测试基础——第7篇 简单的Python知识普及(二)之装饰器
今天我们来学习python里面的“装饰器” 1.我在函数test运行前想先打印一些内容怎么办? def func(param): print u"打印的内容" para ...
- python高级 之(二) --- 类装饰器
装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...
- Python进阶内容(二)--- 装饰器
谈装饰器前,需要明白一件事,Python 中的函数和 Java.C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数,例如: def foo(): print(" ...
- 【Python学习之二】装饰器
装饰器 首先,给出装饰器的框架: def log(func): def wrapper(*args, **kw): print('call %s():' % func.__name__) return ...
- 从C#到TypeScript - 装饰器
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- python 二——函数、装饰器、生成器、面向对象编程(初级)
本节内容 1.函数 2.装饰器 3.生成器 4.类 一.函数 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 函数式 ...
- django之基于cookie和装饰器实现用户认证
示例1 # Create your views here. user = "a" pwd = "a" def login(request): if reques ...
随机推荐
- nessus安装、msfconsole辅助模块使用(网安全实训第三天)
本期内容:nessus安装.msfconsole辅助模块使用.后渗透攻击 1. nessus安装 2.msfconsole辅助模块使用 3.后渗透攻击 1. nessus安装 (1)下载nessus ...
- java面向对象基础知识
一.面向对象与面向过程的区别: ①所处的角色不同:前者指挥者,后者执行者:②所需知道的事情不同:前者知道哪些是做这些事情的人就可以,不需了解具体的事情操作的过程.后者需要具备应有的技能来做这些事情. ...
- Python3 并发编程小练习
实现基于TCP协议套接字,服务端实现接收客户端的连接并发 # server.py import socket from threading import Thread server = socket. ...
- JS系列:js节点
节点(node) 在html文档中出现的所有东西都是节点 元素节点(HTML标签) 文本节点(文字内容) 注释节点(注释内容) 文档节点(document) … 每一种类型的节点都会有一些属性区分自己 ...
- Vue中实现聊天窗口overflow:auto自动滚动到底部,实现显示当前最新聊天消息
在做消息的项目,当有新消息的时候让新消息出现在最底部,此时的box用的是overflow:auto 注意:vue项目需要注意在dom结构渲染完再进行操作 <div class="mai ...
- 业级PPTP服务器搭建企
搭建企业级PPTP服务器 分类: Linux服务篇 undefined 本文收录在企业项目实战系列 一.VPN 介绍 1.介绍 虚拟私人网络(英语:Virtual Private Network, ...
- nginx 自启动设置
首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令: 1 vim /etc/init.d/nginx 在脚本中添加如下命令: #!/bin/sh # # nginx ...
- ELK和EFK的区别
ELK 是现阶段众多企业单位都在使用的一种日志分析系统,它能够方便的为我们收集你想要的日志并且展示出来 ELK是Elasticsearch.Logstash.Kibana的简称,这三者都是开源软件,通 ...
- Microsemi Libero使用技巧——FPGA全局网络的设置
前言 刚开始做Microsemi FPGA+SoC开发时,会用到几个ARM专用的IP Core,功能一复杂起来,就会遇到某些信号如rst_n不能分配到指定的引脚上的情况,IO类型为CLKBUF,并不是 ...
- 【GZOI 2019】特技飞行
Problem Description 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代表着水平位置,纵坐标代表着飞行高度. ...