본문 바로가기
World/Nest.js

nestjs_에러해결_DTO validation 작동이 되지 않는 문제

by RIEM 2023. 4. 26.
728x90

상황

users 생성 POST API에 email, name, password를 body 값으로 받아준다. 이때 DTO에 적용했던 validation에 걸리는 body 값 형식은 모두 예외처리하도록 하고싶다. 

문제

DTO를 적용하면 바로 해결될 것이라 생각했으나, 예외 처리가 되지 않고 정상적으로 요청이 수신되었다.

...

@UseFilters(HttpExceptionFilter)
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  getCurrentUser() {
    return 'currentUser';
  }

  @Post()
  async signUp(@Body() body: CreateUserDto) {
    console.log(body);
    return 'signUp';
  }
...

 

create-user.dto.ts는 아래와 같다.

import { IsEmail, IsNotEmpty, IsString } from 'class-validator';

export class CreateUserDto {
  @IsEmail()
  @IsNotEmpty()
  email: string;

  @IsString()
  @IsNotEmpty()
  password: string;

  @IsString()
  @IsNotEmpty()
  name: string;
}

 

해결

ValidationPipe()를 글로벌하게 적용하지 않아서 발생한 문제였다.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
import * as hbs from 'express-handlebars';
import { HttpExceptionFilter } from './common/exceptions/http-exception.filter';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  // const app = await NestFactory.create(AppModule);
  const app = await NestFactory.create<NestExpressApplication>(AppModule);

  app.useGlobalFilters(new HttpExceptionFilter());
...
  // 글로벌 validation pipe 설정
  // DTO validation을 위함
  app.useGlobalPipes(new ValidationPipe());

  await app.listen(3000);
}
bootstrap();

 

이제 에러 처리를 잘 해준다.

728x90

댓글