[Typescript]用装饰器封装Express服务(1)-背景与设计

200 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

背景

最近因为工作上的需要,使用nodejs+ts+express构建了一个内部使用的api工具web.express构建http服务简单且便捷,只需要要new一个express实例,配置端口,并编写路由以及相关的handle function就可以了.不过,随着功能模块和接口的增多,通过app.post或者app.get这类形式是编写路由,变得繁琐起来.如果能像springboot一样,通过注解(装饰器)的形式,添加相关模块和功能,可以大大增加代码的简洁度和可读性.目前,已将有挺多优秀的"spring-node"框架,如nestjs等,不过,由于原项目是构建在express上的,迁移到其他框架上,会加大工作量,所以,我决定在原express的基础上进行改造设计.

设计

目前,项目运行的流程图如下

image.png

@EnableApplication(port,scanPath)
class App(){}

当项目启动时,实例化Application上下实例,并实例化express实例.在完成实例化后,根据默认或者指定的目录,扫描加载组件,包括controller,component等,将其实例化,并放入上下文缓存中.

@WsService()
class Service(){}

接着,添加websocket服务.由于,如果在添加websocket路由和handle之前,添加其他express中间件,如jwt等,会使websocket监听失败,所以,这里的执行顺序是,先添加ws服务,再添加其他组件和中间件.当然,大佬们要好的方法方式,请务必留言指教.

@@PreComponent()
class Service(){}

在添加了ws服务之后,就是添加前置服务,如express的中间件,过滤器等.这是每个请求进入controller之前的中间件handle,如jwt鉴权等.

@Controller()
class Service(){}

然后,便是添加各个业务模块的controller.

最后为express添加端口,监听api请求.