zoukankan      html  css  js  c++  java
  • typescript与nodejs(二)基于装饰器实现路由表

    之前实现了一个简单的WebServer

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


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

    啥是路由表

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

    onhttp…

    {

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

            。。。

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

    }


    当然我们不可能这样写

    image

    image

    image

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

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


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

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

    路由表的自动注册

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

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

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


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

    1.使用装饰器

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


    image

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

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

    image

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


    2.触发载入文件

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

    image

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

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


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

    image

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


    效果

    这个程序的效果是

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

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

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

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

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

  • 相关阅读:
    JRE、JDK和JVM之间的关系
    操作系统——CPU、计算机的构成
    为什么要用Java泛型
    【docker】 centos7 下 使用docker 安装 LNMP
    【docker】 centos7 安装docker
    【laravel5.6】 IlluminateDatabaseQueryException : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
    【truffle】Error: `truffle init` no longer accepts a project template name as an argument.
    【宝塔面板】pm2 安装没反应问题
    【node.js】】MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。
    【git】 linux 环境安装git
  • 原文地址:https://www.cnblogs.com/crazylights/p/11853844.html
Copyright © 2011-2022 走看看