DTO & 유효성 검사 (ValidationPipe)

2022. 8. 27. 23:33Nest.js

//main.ts

app.useGlobalPipes(
    new ValidationPipe()
  )

npm i class-validator class-transformer

//create-movie.dto.ts

import { IsNumber, IsString } from "class-validator";

export class CreateMovieDto{

    @IsString()
    readonly title: string;
    
    @IsNumber()
    readonly year: number;

    @IsString({ each: true })
    readonly genres: string[];
}

유효성 검사를 위해 작성한다.

빠진 값이 있거나 타입에 맞지 않는 값이 있을 경우 에러를 내보낸다 하지만 , 여기까지만 하면 추가로 바디값에 넣는 건 잡아내지 못한다.

 

{
    "statusCode": 400,
    "message": [
        "title must be a string",
        "year must be a number conforming to the specified constraints",
        "each value in genres must be a string"
    ],
    "error": "Bad Request"
}
//main.ts

app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
    })
  )

위의 코드를 추가함으로써 미리 지정해놓은 값이 아닌경우 에러를 내보내는 더 완벽한 유효성 체크가 된다.

마지막으로 transform: true 를 추가하게 되면 지정해준 타입으로 변경해준다.

예를 들면 get요청시 Param id를 number로 지정해놓았다면 맞게 변경해준다.

원래는 string으로 들어왔었음.

app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true, //들어오는 값을 지정해준 타입으로 변경해준다.
    })
  )

 

업데이트 요청시 create할 때 바디값을 전부 채울 필요가 없이 , 수정하려는 값만 채우면 된다.

그 경우 PartialType(적용하려는Dto)를 이용하여 해결가능하다.

npm i @nestjs/mapped-types

//update-movie.dto.ts
export class UpdateMovieDto extends PartialType(CreateMovieDto) {}

 

'Nest.js' 카테고리의 다른 글

Providers/ DI  (0) 2022.09.04
Controller  (0) 2022.09.04
Nest.js 기본  (0) 2022.08.26
TypeORM  (0) 2022.08.23
Nest.js 설치 및 시작  (0) 2022.08.17