routing-controllers、class-validator、typedi的使用总结

本文是关于routing-controllers、class-validator和typedi在TypeScript后端开发中的应用总结。内容涵盖安装、基本使用、中间件、拦截器、安全认证、依赖注入等方面,提供了从API路由到类验证和依赖管理的全面概述。
摘要由CSDN通过智能技术生成

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}端口`);
})
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值