NestJSでのDTO


  • DTO
  • データ転送対象
  • どの値がタイプで、どの値が必要ですか? 定義ファイル
  • npm i class-validator class-transformer
  • main.tsのパイプを設定する

  • express検証を設定するミドルウェアに似ていると考えられます.
  • whiteList -> 엔티티 데코레이터에 없는 프로퍼티 값은 무조건 거름
  • forbidNonWhitelisted -> 엔티티 데코레이터에 없는 값 인입시 그 값에 대한 에러메세지 알려줌
  • このオプションがtrueである場合、dtoで定義されていないアイテムをbodyにコミットする場合、 property「xxx」という名前のエラーが発生します.
  • 、すなわちdtoで定義されていないプログラムをブロックするために使用される.
  • transform -> 컨트롤러가 값을 받을때 컨트롤러에 정의한 타입으로 형변환-paramで入力した値はstringで入力する必要があります.
    -ただし、dbではidはuuidではないので、ほとんどnumberタイプです.したがってidをparamsにインポートする場合はnumberに変換する必要がある.
    -nestは、このような不要なプロセスを省略するためにtransformというオプションを作成した.
    import { ValidationPipe } from '@nestjs/common';
    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      app.useGlobalPipes(
        new ValidationPipe({
          whitelist: true,
          forbidNonWhitelisted: true,
          transform: true,
        }),
      );
      await app.listen(3000);
    }
    bootstrap();

  • 変換例
    @Controller('movies') //movies라우터링 같음
    export class MoviesController {
      //매개변수 프로퍼티(Parameter Property) 를 이용하여 선언과 할당을 동시에 할 수 있습니다
      constructor(private readonly moviesService: MoviesService) {}
    
      @Get('/:id')
    	//원래는 id는 string이지만 movieId: number을 지정함으로 id의 타입은 number로 변환된다..
      getOne(@Param('id') movieId: number): Movie {
        console.log(typeof movieId);
        return this.moviesService.getOne(movieId);
      }
    }

  • create-movie.dto
    - @IsOptional()
    -値がNULL(またはNULLまたは未定義)の場合でも、検証は無視されます.
    import { IsNumber, IsString } from 'class-validator';
    
    export class CreateMovieDto {
      @IsString()
      readonly title: string;
      @IsNumber()
      readonly year: number;
    	// 배열이면 each true
    	@IsOptional()
      @IsString({ each: true })
      readonly genres: string[];
    }
  • 作成したdto
  • をコントローラに適用
  • movies.controller.ts
    @Controller('movies') //movies라우터링 같음
    export class MoviesController {
      //매개변수 프로퍼티(Parameter Property) 를 이용하여 선언과 할당을 동시에 할 수 있습니다
      constructor(private readonly moviesService: MoviesService) {}
    
      @Post()
      create(@Body() movieData: CreateMovieDto) {
        return this.moviesService.create(movieData);
      }
    }
  • movie.service.ts
    @Injectable()
    export class MoviesService {
      private movies: Movie[] = []; //선언한 class내에서만 접근가능
    
      create(movieData: CreateMovieDto) {
        this.movies.push({
          id: this.movies.length + 1,
          ...movieData,
        });
      }
    }
  • update-movie.dto.ts

  • npm i @nestjs/mapped-types
    - PartialType
    -入力タイプを返すすべてのプロパティがオプションタイプ(クラス)に設定されています.(要件:各プロパティには、少なくとも1つの検証データレコーダが適用されます).
    import { PartialType } from '@nestjs/mapped-types';
    import { IsNumber, IsString } from 'class-validator';
    import { CreateMovieDto } from './create-movie.dto';
    
    export class UpdateMovieDto extends PartialType(CreateMovieDto) {}