美文网首页nestjs学习笔记
4.nestjs:请求入参校验

4.nestjs:请求入参校验

作者: HunterK | 来源:发表于2022-05-04 15:52 被阅读0次

    在整合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

    相关文章

      网友评论

        本文标题:4.nestjs:请求入参校验

        本文链接:https://www.haomeiwen.com/subject/ocabyrtx.html