본문 바로가기

Nest js/class-validator

class-validator

728x90

class-validator란 ?  "  typescript를 사용하여  데코레이터로 검증한다! "

너무 간단하게 이야기 했나? 짧고 시원하게 이해가 가도록 설명하겠다!

첫 번째 이해 방법: POST 요청의 라우터 핸들러가 있고 @Param 또는 @Body  여기에서 JSON의 body를 받는다 -> class-transformer로 클래스 인스턴스로 변환 -> class-validator로 userId가 email형식으로 써졌나 ? 뭐 이런 느낌 ( 아래의 예시 참고)   

10초 컷 이해

  친절한 NestJS는 뭐가 이상한 지 다 알고있고 계획이 있다 캬 죠타.. 

일단 Install 유남셍?

  • 사전 설치: npm i --save class-validator class-transformer
  • Typescript는 가능 / Vanilla Javascript 불가
    NestJS 공홈 Pipes 탭

DTO: CreateMemberInput 클래스 

import { IsEmail, IsString } from "class-validator"; //#설치 필요!!

export class CreateMemberInput
{
  @IsString()
  @IsEmail() 
  userId: string;
  password: string;
  address: string;
  memberType: string;
}

 

Controller: MemberController에서 회원가입 라우트 핸들러 

 import {Body, Controller, Post } from '@nestjs/common';
 @Controller('member')
export class MemberController {
  constructor(private memberService: MemberService) {
    this.memberService = memberService;
  }
     //#CreateMemberInput은 DTO 
     @Post('/join') 
      signUpForMembership(@Body() memberInfo: CreateMemberInput) {
        try {
          return this.memberService.signUpForMembership(memberInfo);
        } catch {
          console.error();
        }
      }
  
  }

 

설정1 : app.module.ts

//이 파일은 app.module.ts

import { Module, ValidationPipe } from '@nestjs/common';
import { APP_PIPE } from '@nestjs/core';

@Module({
  providers: [
    {
      provide: APP_PIPE,
      useClass: ValidationPipe,  // #기본 제공되는 ValidationPipe
    },
  ], 
})
export class AppModule {}

 

설정2: main.ts

import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common/pipes/validation.pipe';
import { NestFactory } from '@nestjs/core';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  //# 글로벌 파이프 파라미터에 ValidationPipe 인스턴스 생성해서 넣어준다.
  app.useGlobalPipes(
    new ValidationPipe({
      disableErrorMessages: true, // 프로덕트 단계에서 세부 에러 비활성
    }),
  await app.listen(3000);
}
bootstrap();
728x90