在整合swagger中,虽然入参虽然使用了dto,但是我们使用instanceof发现它并不是我们dto的instance
image.png
如果想要达到dto校验的效果需要自己配置,这里不同的配置会有不同的效果,这里最终的效果是这样的:前端传入的字段必须在dto中存在,如果不存在就会被忽略掉,如果字段存在但是类型不一样则会报错,嵌套dto和数组的配置有些特殊需要注意.
1.首先安装校验工具包
npm i --save class-validator class-transformer
2.在入参request dto上加上对应的装饰器
import { ApiProperty } from "@nestjs/swagger"
import { Type } from "class-transformer"
import { IsNumber, IsOptional, IsString, ValidateNested } from "class-validator"
export class UserHobby{
@ApiProperty()
//数组的配置要加上each:true
@IsString({each:true})
hobbyName:string[]
}
export class UserRequestDto{
//如果该字段前端可能传入,也可能不传入则使用@IsOptional()
@IsOptional()
@IsString()
@ApiProperty()
name:string
@IsNumber()
@ApiProperty()
age:number
//如果是嵌套类型是数组可以在ValidateNested配置each:true
//@Type 指定嵌套类型
@ValidateNested()
@Type(() => UserHobby)
@ApiProperty()
hobbyName:UserHobby
}
3.在main.ts配置全局使用validate该功能
app.useGlobalPipes
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { Transform } from 'class-transformer';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter()
);
const options = new DocumentBuilder()
.setTitle('nest-demo')
.setDescription('The nest-demo API description')
.setVersion('1.0')
.addTag('nest-demo')
.build();
const document = SwaggerModule.createDocument(app, options);
SwaggerModule.setup('api', app, document);
//全局使用dto校验
app.useGlobalPipes(
new ValidationPipe({
whitelist:true,
transform:true
})
);
await app.listen(3000, '0.0.0.0');
console.warn(`app start listen on 3000`)
}
bootstrap();
whitelist:true, 作用是将传入的参数只保留使用装饰器的字段(类似@IsNumber())
transform:true 作用是将参数转为对应的class 的instance.
最终效果:
image.png
tips1:如果该字段前端可能传入,也可能不传入则使用@IsOptional()
tips2:开启此功能将会损耗很少一部分性能
tips3: plainToInstance from 'class-transformer 此方法可以将对象转为dto
网友评论