Nest 에러 핸들링

Charley1013·2023년 9월 16일

NestJS

목록 보기
2/2
post-thumbnail

Nest 에러 핸드링

request시 의도하지 않는 데이터 형식이나 전달하더라도 에러를 발생시키지 않는다. 이 부분을 유연하게 관리하는 방법에 여러 가지가 있다.

NotFoundException

NotFoundException 생성자를 활용해 request 조건에 따라 error를 발생시킬 수 있다.

getOne(id: string): Movie {
  const movies = this.movies.find((movie) => movie.id === +id);
  if (!movies) {
    throw new NotFoundException(`${id}의 정보는 없습니다`);
  }
  return movies;
}

// result => http://localhost:3000/443
{
	"message": "443의 정보는 없습니다",
	"error": "Not Found",
	"statusCode": 404
}

DTO 생성

request시 의도한 형식이 아님에도 특별한 조작 이는 201를 던져 오류가 발생하지 는다. 컨트롤러와 서비스에 DTO(Data Transfer Object)를 생성해 에러 핸들링을 할 수 있다.

// movies/dto/create-movie.dto.ts
export class CreateMovieDto {
  readonly title: string;
  readonly year: number;
  readonly genres: string[];
}

// controller dto export
@Post()
// CreateMovieDto type에 대한 유효성 검사가 가능
create(@Body() movieData: CreateMovieDto) {
  return this.moviesService.create(movieData);
}

// service dto export
create(movieData: CreateMovieDto) {
  this.movies.push({
    id: this.movies.length + 1,
    ...movieData,
  });   
  return `생성 완료`;
}

DTO 유효성 검사

우선 class의 유효성 검사를 위해 패키지를 설치합니다.

pnpm i class-validator class-transformer

DTO에 유효성 검사 decorator 생성

// ...dto.ts
import { IsNumber, IsString } from 'class-validator';

export class CreateMovieDto {
  @IsString() // string 검사
  readonly title: string;

  @IsNumber() // number 검사
  readonly year: number;

  @IsString({ each: true }) // string인지 하나씩 검사
  readonly genres: string[];
}

잘못된 형식으로 제출했을 경우 발생하는 에러

DTO 부분 업데이트

기존 dto의 타입 형식을 활용한 API에서 update 메소드의 경우 모든 타입이 필수가 아닌 경우가 발생한다. 이 상황도 유연하게 처리하도록 수정이 필요하다.

  • 기존 create DTO 속성에서 필요한 타입만 가져오는 Partial 유틸리티 타입을 맵핑하기 위한 유틸리티 라이브러리를 설치한다.
pnpm i @nestjs/mapped-types
  • update DTO 생성
    타입 자체를 옵셔널하게 제공하고 싶을 때 @IsOptional를 데코레이션하면된다.
import { PartialType } from '@nestjs/mapped-types';
import { CreateMovieDto } from './create-movie.dto';

export class UpdateMovieDto extends PartialType(CreateMovieDto) {}

파이프 추가설정

미들웨어의 개념으로 현재는 request의 대한 유효성 검사를 하기 위해 useGlobalPipes에서 ValidationPipe 의 설정을 진행합니다.

// main.ts
...
app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true, // 유효성 검사 실패 시 Validate에 도달하지 않음
    forbidNonWhitelisted: true, // 잘못된 형식은 Request 자체를 하지않음
    transform: true, // path parameter에 대한 타입 추론이 가능해짐
  }),
);
...

잘못된 키가 들어갔을 때 Request error가 발생한다.

profile
프론트엔드 개발자 김찰리

0개의 댓글