segmentfault官方|为 Express 开外挂( 七 )


controllers.forEach((controller: Controller) => {
this.app.use(routerAndPath.basePath, routerAndPath.router);
});
}
从上面代码可以看出 ,addControllers 方法支持传入单个 controller 或一个数组的 controller , 方法内通过 forEach 遍历每个控制器 , 并将 path 和 router 作为参数传入 app.use 方法中 , 实现 Express 的路由注册 。
四、Overnight VS Express
从前面概念介绍中 , 我们知道:OvernightJS 主要是为 Express 路由提供 Type 装饰器支持 , 通过装饰器来管理路由 。
那么使用 OvernightJS 跟没有使用有什么区别呢?
下面我们分别通过 OvernightJS 和 Express 实现相同功能 , 功能包括:本地启动 4000 端口 , 支持 api/users/:id 接口 。
1. OvernightJS 实现
首先实现入口文件 , 其中通过实例化 ServerController 类 , 并执行实例化结构的 start 方法来启动服务:
// customApp.ts
import ServerController from "../controller/custom.server.controller";
const port = 4000;
const server = new ServerController;
server.start(port);
其中 tsconfig.json 配置如下:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"experimentalDecorators": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}
大致过程如上面代码 , 接下来要开始实现具体的 ServerController 类:
// controller/custom.server.controller.ts
import { Server } from "@overnightjs/core";
import RouterController from "./custom.router.controller";
class ServerController extends Server {
constructor{
super;
super.addControllers(new RouterController);
}
public start(port?: number): void {
this.app.listen(port, => {
console.log( '启动成功 , 端口号:',port)});
}
}
exportdefault ServerController;
最后实现 RouterController 类 , 该 API 下的路由方法 , 都定义在这个类中:
// controller/custom.router.controller.ts
import { Request, Response } from 'express';
import { Controller, Get, Put } from '@overnightjs/core';
@Controller( "api/users")
class RouterController {
@Get( ":id")
private get(req:Request, res:Response): any{
res.send( "hello leo!")
}
}
exportdefault RouterController;
2. Express 实现
跟前面一下 , 这里也是先实现入口文件:
// app.ts
import ServerController from "../controller/server.controller";
const port = 4000;
const server = new ServerController;
server.start(port);
然后实现具体的 ServerController 类:
// controller/server.controller/.ts
import express, { Application } from 'express';
import RouterController from "./router.controller";
class ServerController {
app: Application = express;
constructor{this.addControllers};
public addControllers{
const Router = new RouterController.getController;
this.app.use( '/api/users', Router);
}
public start(port?: number): void {
this.app.listen(port, => {console.log( '启动成功 , 端口号:',port)});


推荐阅读