1.0.0 • Published 4 years ago

qzx-controller-express v1.0.0

Weekly downloads
5
License
ISC
Repository
github
Last release
4 years ago

基于 Express + Typescript 的注解式插件

安装

npm i qzx-controller-express --save

使用

import { RouterControllerPlugin } from 'qzx-controller-express';
import { join } from 'path';
app
.use...
.use(
  RouterControllerPlugin({
    hotreload: core.$env.isDevelopment(), // 表示可以不重启加载路由文件 开发环境下使用
    routerPath: join(__dirname, 'routers'), // 表示路由的存放位置,后期会根据这个位置和请求去自动定位处理文件
  }),
);

思想

http的请求多种多样,一般来讲我们都是在路由里面通过路径去匹配。这种方式简单。

然而,随着项目的复杂度的增加,这种方式的可维护性就会下降很多,开发经常性的会遇到一个问题就是不知道去哪里找对应的处理请求。

很多时候,越是复合直觉的其实越简单

在这个基础上,阿里的egg.js框架就提出了,约定往往更加重要,阿里的约定就是各种 controller/service 自动装载。

不过,自动装载其实有点浪费,需要一次性加载所有的路由文件。

按路径加载

我们的这个插件做了一些改变,不是自动装配,也不是在文件里写死路由,而是直接通过请求路径去匹配请求。这很符合 rest 请求的第一直觉。每个路径就相当于一个资源,一个屋子,一个文件夹。

---src
  ---routers
    ---test.ts

假设有如上的一个文件: test.ts, 你可以这么写

import { Get, Query, Param, Controller } from '../../src';
import { ServiceOfCore } from '../../services';

@Controller()
export default class {
  constructor(private $core: ServiceOfCore) {}
  @Get('aaa')
  index() {
    return 'bbb';
  }
  @Get()
  ttt(@Query('name') name: string = '', @Body('sss') ss: string = '') {
    return `${name}${sss}` || 'ccc';
  }
  @Get('asd/:name/dd/:id')
  sss(@Param('name') name: string, @Param('id') id: string) {
    console.log(name, id);
    return `${id}: ${name}`;
  }
}

GET /test/ttt => 'ccc'

GET /test/ttt?name=123 => '123'

POST /test/ttt?name=123 body {sss: 1111} => '1231111'

GET /test/aaa => 'bbb'

GET /test/asd/qianzhixiang/dd/1 - 1: qianzhixiang