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 中所有的装饰器按照源码目录结构维度做了分类 , 结果如下:
segmentfault官方|为 Express 开外挂
本文插图

通过上图可以清晰看出 , OvernightJS/core 为我们提供了四个大类的装饰器 , 具体的使用方式 , 还请看看官网文档啦~
4. OvernightJS/core 架构分析
OvernightJS/core 结构设计上还是比较简单 , 大致如下架构:
segmentfault官方|为 Express 开外挂
本文插图

在 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];


推荐阅读