Search

#043 #class validator

 CLI 설치

pnpm install class-validator class-transformer
JavaScript
복사

 파이프 등록

 src > main.ts

import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(new ValidationPipe()); await app.listen(process.env.PORT ?? 3000); } bootstrap();
JavaScript
복사
글로벌 파이프라인으로 ValidationPipe를 등록해야된다.

 validator 추가

이제 Post요청에서 요청데이터에 title 또는 genre가 비어있으면 에러를 반환 한다.

 에러 반환 형태

{ "message": [ "genre should not be empty" ], "error": "Bad Request", "statusCode": 400 }
JavaScript
복사
이 에러 형태는 잘 봐둬서, 나중에 처리를 잘하자

 정상 요청

이제 정상적으로 title / genre를 입력해야 요청이 처리된다.

 자주쓰는 class validator

class validator 깃 허브
class-validator
typestack
validation 종류가 정리되어 있는 섹션
여기서 찾아서 공부하면 된다.

 Validator 만들기

 해당 dto에서 커스텀 validator를 만들어주면 좋을 것 같다

해당 인터페이스는 class-validator 라이브러리에 속해있다.

 인터페이스 구현체 구현

클래스에 quick fix action을 호출하면 인터페이스 구현 메뉴가 나온다. 클릭

 유효성 로직과 메시지

validate 메소드에는 유효성 검증 로직을 defaultMessage는 실패시 안내 메시지
예시 코드
class PasswordValidator implements ValidatorConstraintInterface { validate( value: any, validationArguments?: ValidationArguments, ): Promise<boolean> | boolean { return value.length > 4 && value.length < 8; } defaultMessage?(validationArguments?: ValidationArguments): string { return '비밀번호의 길이는 4~8자 이어야 합니다.'; } }
JavaScript
복사

 요청 필드 어노테이션 달기

1.
커스텀 validator에 @ValidatorConstraint 등록
2.
검증을 원하는 요청 dto 필드에 커스텀 밸리데이터 사용
3.
로직/반환 형태 확인

 다른 방법 ⇒ registorDecorator 함수

 함수 생성

function IsPasswordValid(validationOptions?: ValidationOptions) { return function (object: Object, propertyName: string) { registerDecorator({ target: object.constructor, propertyName: propertyName, options: validationOptions, constraints: [], validator: PasswordValidator, }); }; }
JavaScript
복사
함수 이름을 정하고 registerDecorator를 사용해서 validator에 커스텀밸리데이터를 등록해준다.

 요청 dto에 데코레이터 적용

이렇게 다른 데코레이터들 처럼 이름으로 가져와서 사용할 수 있다.
근데 개인적으로는 한 데코레이터들 마다 함수를 다 만들어야 되는거면,
처음 버전의 밸리데이터 방식이 좀 더 괜찮은 것 같다.
작동확인
잘 작동한다.

️ ValidatorConstraint는 비동기로도 사용할수있다!

 whitelist

main.ts > ValidationPipe에서 적용할 수 있는 옵션으로 whitelistforbidNonWhitelisted 을 사용할 수 있다.

 main.ts

whitelist: true 일 때
애초에 정의한 형태가 아닌 다른 요청 dto필드는 허용하지 않는다. 하지만 에러는 나지 않는다.
{ whiteList: true, forbidNonWhitelisted: true } 일 때
정의하지 않은 요청 dto 필드는 허용하지 않고, 그에 대해서 에러를 낼 수 있다.