• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

ValidationPipe DTO 변환 대신 JS Object 로 변환되는 이유

24.01.27 05:56 작성 24.01.27 06:16 수정 조회수 172

0

DTO 변환이 잘 되다가 다른 테스트 케이스 작성중에 아래 처럼 SignInUserRequest DTO 로 변환이 안되는 경우를 겪었습니다. ValidationPipe 옵션 transform: true 임에도 불구하고, 이런 현상이 일어나는 이유를 알 수 있을까요?

아래는 잘되는 경우입니다.

읽어주셔서 감사합니다.

답변 2

·

답변을 작성해보세요.

0

Truestar님의 프로필

Truestar

질문자

2024.01.30

NestJS 깃헙 이슈 개설해서 한참 소스코드 고치다보니, 어이없이 해결되었는데요,
문제가 타입스크립트 에 있고, 원인은 타입스크립트 컴파일 시점에 import/export 파일관계가 꼬였다 라고 볼수밖에 없겠습니다.

DTO 클래스 파일 위치를 옮기다보니 index.ts 를 수정하게 되었는데, 이것 때문이라고 추측되었고,

확실한 것은 해당 Request 객체를 참조하는 곳에서 tsconfig.json 의 path alias 로 명시된 경로를 직접 상대경로로 바꿔주니, 정상 작동하기 시작했습니다.

신기한 현상이네요;;

0

https://github.com/nestjs/nest/issues/552#issuecomment-380360876

이렇게 @Body 자체에 파이프를 넣으세요.

Truestar님의 프로필

Truestar

질문자

2024.01.27

답변감사드려요.
원래 GlobalPipes 설정 app.useGlobalPipes(new ValidationPipe({ transform: true })) 상태에서도 안되서 @UsePipes 에도 한번 걸어둔 상태였습니다. 알려주신 방법도 시도해 보았지만, 잘 안되네요..

제가 처한상황에 대해 테스트 케이스 재현 후에 다시 결과 올려보겠습니다.

Truestar님의 프로필

Truestar

질문자

2024.01.28

갑자기 변환이 잘됩니다;; 원인을 찾다가 수정사항이 너무 많아져서 파악이 힘들게 되었는데요,
추측되는 몇가지는...

  1. DTO 필드에 Validation 데코레이터 누락 > 선언

  2. NestJS 의 PickType(OriginDto) 상속 미사용 > 사용

  3. ValidationPipe 옵션 중, whitelist: true활성화

     

등을 추측할 수 있었습니다.
하지만 언젠가 또 마주할 애러같아서 찝찝한 기분을 버릴수가 없네요ㅎㅎ...

image
혹시 원인을 찾게 된다면 이곳에 리뷰 겸 정리해서 다시 올려보겠습니다.
살펴봐 주셔서 감사드립니다.