routing-controllers、class-validator,typedi的使用总结
由于typescript的版本书写的nodejs的接口用之前的方式书写有些不够清晰,也不能提现出typescript的特色,所以就使用了如上几个库书写typescript的接口,类似于后端框架的写法
优点:对于后端的来说更容易接收,并且复用性强一些,只需要改动些许,就能在express或者koa中使用
如果需要深入学习,请前往github官方API深入学习,以下是个人学习后的一些总结。 官方API地址(https://github.com/typestack/routing-controllers)
1.安装: reflect-metadata routing-controllers class-validator typedi 四个库,如果先使用routing-controllers则后面两个可以之后安装
yarn add reflect-metadata routing-controllers class-validator typedi --save
2.首先是routing-controllers,它可以用装饰器的写法替代寻常的express和koa的写法,例如:
import {
Controller, Get, Param } from 'routing-controllers';
//路由器 router 相当于const router = express.Router();用
@Controller()//书写,括号可传url,不传则相当于/,传/api 就是每次访问里面的路由要加上/api
class UserController{
//用类代替一个router,里面每个加上POST,GET,PUT,DELETE,PATCH...的方法都是一个路由
@Get('/user/:id')//定义一个get请求
public getUser(@Param('id') id:string){
//想要获取参数,定义和参数一致的key,然后使用变量接收
console.log(id);//当输入localhost:5000/user/12312321 打印12312321
//需要返回给前端的数据直接return回去,这里建议使用async 和await来进行数据库的交互,
//可以返回promise和字符串、对象等
return id;
}
}
3.除了@Controller() 、还可以使用@JsonController()这个装饰器修饰类,使用方式差不多,直接返回一个json对象,同时一样可以使用promise
其次还有POST,DELETE,PUT,PATCH等注解,表示这是一个什么类型的请求,required:true表示这个参数是必选的,不传递则会直接报错抛出
required可以在各种参数装饰器中使用,例如@Param @Body等等等
@Post('/add/user')//可以不传url字符串
public postUser(@Body({
required:true}) user:User){
//@Body获取到全部前端通过POST,DELETE,PUT,PATCH...请求传入的数据,可以使用一个类来接收这个对象,
//User就是对应的那个类
//...
}
其它参数装饰器:CookieParam CookieParams Session Params BodyParam HeaderParam HeaderParams QueryParam QueryParams Res Req...
import {
validate, ValidationError } from 'class-validator';
@Post('/get/user')
public async postGetUser(@Body({
validate: true }) user: User, @Req() request: Request, @HeaderParams() header: any, @Res() response: Response) {
const err: ValidationError[] = await validate(user,{
skipMissingProperties: true });//跳过对象不存在的,然后验证
if (err.length > 0) {
//当验证错误,长度为大于0
return err;
}
return response.json({
...user, ...header });
}
@Post('/test/:id/:name')
public test(@Params() params:any,@BodyParam('username'){
required:true})usern:string){
//必传 username
console.log(params.id,params.name);//可以获取到参数
console.log(usern);//可以打印出前端传入的username
return 'ok';
}
Req和Res就是一个route中的request和response,Params获取的是一个参数对象、BodyParam获取的是每一个data/body中的值、HeaderParam也类似、所有的使用都类似,复数则是整个,单数则只是获取传入的字符串这个key来决定
验证是class-validator库的东西,后面介绍
同理,其它@Delete()、@Put()…使用方式类似,当然这些要配合类的装饰器@Controller()或者@JsonController()来使用
4.然后就是注册这些resful风格的Api了,createExpressServer不建议使用(因为存在bug,不能注册到bodyparser那些插件)
,使用useExpressServer,记得安装express、body-parser以及@types/express、@types/body-parser
4.1安装依赖,@types/…是为了在typescript中支持所需要的
yarn add express @types/express @types/body-parser body-parser ts-node -S
4.2注册到express中
import "reflect-metadata";
import {
useExpressServer } from "routing-controllers";
import express, {
Express } from 'express';
import bodyParser from "body-parser";
//创建app
const app: Express = express();
//把bodyParser的插件注册到app容器中
app.use(bodyParser.urlencoded({
extended: false }));
app.use(bodyParser.json());
//设置端口
const port: number = (process as any).env.PORT | 5000;
//使用express服务
useExpressServer(app, {
controllers: [UserController]//是一个数组,可以支持多个控制器注册
}).listen(port, () => {
console.log(`服务器运行在${
port}端口`);
});
这样程序就能执行了,并且运行在5000端口,可以访问上面定义的/user的get请求和/add/user的post请求了
4.3 注册到koa容器中,类似,下载koa的依赖
yarn add koa koa-router koa-bodyparser @types/koa @types/koa-router @types/koa-bodyparser ts-node --save
然后使用这些依赖,同时不建议使用createKoaServer,使用方式类似express
import "reflect-metadata";
import {
useKoaServer } from "routing-controllers";
import Koa from 'koa';
import koaBodyParser from 'koa-bodyparser';
const app: Koa<any, {
}> = new Koa();
app.use(koaBodyParser());//使用中间件
const port: number = (process as any).env.PORT | 5000;
useKoaServer(app, {
controllers: [UserController]
}).listen(port, () => {
console.log(`服务器运行在${
port}端口`);
})