NestJS 개발 시 DTO로 입력되는 값을 Validation 하고 싶을 때, ValidationPipe를 많이들 사용하곤 한다.

이번에 ValidationPipe를 활용하여 백엔드 API를 개발하던 중 겪은 에러가 있어 기록한다.

 

 

What happend?

우선, NestJS App 생성 시 ValidationPipe의 whitelist & forbidNonWhitelisted 옵션을 모두 true로 설정했다.

    this.defaultApp.useGlobalPipes(
      new ValidationPipe({
        whitelist: true,
        forbidNonWhitelisted: true,
        transform: true,
      }),

 

 

그리고 Postman을 활용하여 POST 로직을 테스트했는데, 아래와 같이 DTO가 상속한 Entity에는 네 항목이 모두 존재하는데도(우측 창 - 해결 후 상황을 재현하느라 Type Decorator들이 주석 처리되어 있다.) 모든 항목이 없어야 한다며 에러를 내뱉는다(좌측 창).

 

에러 발생...

 

 

 

What went wrong?

졸린 와중에 개발 & 검색하느라 원문을 잃어버렸지만, 구글 검색 결과 중 특정 글에서 'DTO의 각 항목은 최소한 하나의 Type Decorator를 가져야 한다'는 글을 보고 아래와 같이 수정하였다.

 

수정 후, 우측 아래 console.log를 보면 정상적으로 body 수신이 되고 있음을 볼 수 있다.

 

 

 

수정 후에는 우측 아래 console.log를 보면 정상적으로 body 수신이 되고 있음을 볼 수 있다.

 

 

 

 Lesson & Learned

  • ValidationPipe whiteList 옵션 사용 시 반드시 Type Check Decorator를 지정하자.
반응형

멍청한 에러들을 기록한다.

 

 

What happend?

NestJS로 백엔드 개발을 하던 중, 기존 Array에 push하는 부분에서 자꾸만 'ERROR [ExceptionsHandler] XXX is not a function' 에러가 발생했다.

 

ERROR [ExceptionsHandler] XXX is not a function

 

 

로직도 수차례 변경해 보고, push 함수가 아니라 새로운 Array를 만들어 slice로 깊은 복사 후 재 할당도 해보고 온갖 짓을 다 했으나 해결이 안 됐다.

 

자고 일어난 다음날, 테스트를 하다가 해결했다.

역시 졸린 상태에서는 개발하는 거 아니다.

 

 

 

What went wrong?

Movie 정보를 담고 있는 this.movie는 Array인데, update시 호출하는 deleteMovie 로직에서 delete 후 Array가 아닌 List로 담는 바람에 오류가 발생했다.

 

List에는 당연히 push function이 없으니까 위와 같은 에러가 발생한다.

 

휴...

 

 

 

 Lesson & Learned

  • API 테스트 결과 확실히 살피기 - 자료형이나 Depth 등이 변하진 않았는지
  • TypeScript 맹신하지 않기 - movies를 Movie[]로 선언하였으나 로직 중에 해당 변수에 List를 할당해도 에러가 발생하지 않는다.
    (그러나 다이렉트로 movies = {}; 따위를 넣어버리면 오류가 발생한다.)

 

 

 

 

끝.

반응형

+ Recent posts