在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
之前实现了一个简单的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 |
请发表评论