segmentfault官方|为 Express 开外挂( 六 )
class UserController {
@Get( ':id')
private get(req: Request, res: Response) {
returnres.send(`hello, your id is: ${req.params.id}`)
}
@Get( 'list')
private get(req: Request, res: Response) {
returnres.send([
{name: "leo", age: 17},
{name: "robin", age: 19}
])
}
}
class ServerController extends Server {
constructor{
super;
this.app.use(bodyParser.json);
super.addControllers(new UserController);
}
public start(port?: number): void {
this.app.listen(port, => {console.log( '启动成功 , 端口号:',port)});
}
}
const server = new ServerController;
server.start(port);
3. OvernightJS/core 装饰器分析
在阅读源码过程中 , 我将 OvernightJS/core 中所有的装饰器按照源码目录结构维度做了分类 , 结果如下:
本文插图
通过上图可以清晰看出 , OvernightJS/core 为我们提供了四个大类的装饰器 , 具体的使用方式 , 还请看看官网文档啦~
4. OvernightJS/core 架构分析
OvernightJS/core 结构设计上还是比较简单 , 大致如下架构:
本文插图
在 OvernightJS/core 中 , 主要提供两个大类:Server 类和 Decorators 相关方法 。
其中 Server 类中的 addConterllers 方法是关键 , 下一节将详细介绍 。
5. OvernightJS/core 与 Express 关联
回顾下 Express, 我们经常通过 app.use(path, route) 来定义一个接口:
app.use(path, route);
那么在 OvernightJS 中呢??
前一小节提到的addConterllers 方法是什么呢??
其实 OvernightJS 本质上是通过调用 addConterllers 方法来和 Express 做关联 。
可以理解为 OvernightJS 与 Express 之间的桥梁 , 它将 OvernightJS/core 定义好的路由控制器作为参数 , 通过 Express 的 use 方法 , 将路由添加的 Express 中 , 实现 Express 路由注册 。
我们看下源码中addControllers 方法做了什么事情:
// core/lib/Server.ts
public addControllers(
controllers: Controller | Controller[],
routerLib?: RouterLib,
globalMiddleware?: RequestHandler,
): void {
controllers = (controllers instanceof Array) ? controllers : [controllers];
const routerLibrary: RouterLib = routerLib || Router;
controllers.forEach((controller: Controller) => {
if(controller) {
const routerAndPath: IRouterAndPath | null = this.getRouter(routerLibrary, controller);
if(routerAndPath) {
if(globalMiddleware) {
this.app.use(routerAndPath.basePath, globalMiddleware, routerAndPath.router);
} else{
this.app.use(routerAndPath.basePath, routerAndPath.router);
}
}
}
});
}
我们简化下上面代码 , 保留核心功能的源码:
public addControllers(
controllers: Controller | Controller[],
routerLib?: RouterLib,
globalMiddleware?: RequestHandler,
): void {
// ... 省略其他代码
controllers = (controllers instanceof Array) ? controllers : [controllers];
推荐阅读
- 蝌蚪五线谱官方|云游杂记·琥珀屋丨杨枫【科幻微小说】
- 旅游那点事|史上最弯!一加8T官方宣布美背照:沾水会变色
- 症状|中国发布丨官方提醒公众旅行归来自我观察14天 有症状及时告知旅行史
- 深圳特区报官方微博|刚刚,诺贝尔文学奖揭晓!是她!
- 湖南经视官方账号|国庆长假期间湖南机场日均客流超过10万人次
- 官方|唐朝时的官方外交名是“大唐”,那清朝的是啥?说出来你可能不信
- 杂志之旅官方|“丧文化”大行其道,当代年轻人为何越来越厌世?
- 实用心理学官方号|心理学:不完美,也配好好活。时间不语,却回答了所有问题
- 趣头条|凯迪拉克发布官方草图,未来凯迪拉克SUV外观设计出炉
- 飞度|东本也要卖“飞度”了,本田LIFE胜算有多大?