添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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.

最终效果: