ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NestJs Controller @Query Pipe 기록
    공부하기/node.js 2023. 2. 25. 01:38

    컨트롤러의 엔드포인트에서 @Query 데코레이터를 사용하여 page, size, sort 변수값을 핸들링 하는 과정을 기록하는 포스팅

     

    통과 기준

    1. page, size, sort 변수값을 입력하지 않을 경우 default value 리턴
    2. page, size, sort의 타입이 일치하지 않는 경우 에러 리턴
    3. page, size, sort 변수 중 일부를 제외한 요청에 정상 작동해야 한다

    @Query() 변수에 기본값을 설정한 후 리턴

    실험 코드

    enum SORT_OPTION {
    ASC ='ASC',
    DESC = 'DESC'
    }
    
      @Get('find')
      async findAll(
        @Query('page') page: number = 1,
        @Query('size') size: number = 10,
        @Query(
          'sort',
        )
        sort: SORT_OPTION = SORT_OPTION.ASC,
      ) {
        return { page, size, sort };
      }

     

    테스트

    1. page, size, sort 변수값을 입력하지 않을 경우 ==> 성공

    응답

    {

    "page": 1,

    "size": 10,

    "sort": "ASC"

    } 

    -> 변수 타입이 의도한대로 정확하게 리턴
     
    2. page, size, sort의 타입이 일치하지 않는 경우 ==> 실패
    응답
    {
    "page": "1",
    "size": "10",
    "sort": "ABC"
    }
     -> page, size의 데이터 타입이 string으로 리턴, sort는 enum 타입으로 ASC, DESC를 제외한 어떤 값도 통과되면 안되는데 ABC로 리턴 됌
     
    결과: page, size의 변수값을 입력 후 요청한 경우 의도하지 않은 응답을 받는다. 에러가 발생할 확률이 높다. 

     

    @Query() 변수에 PipeLine을 추가한 후 기본값을 설정한 후 리턴

    실험코드

      @Get('find')
      async findAll(
        @Query('page', ParseIntPipe) page: number = 1,
        @Query('size', ParseIntPipe) size: number = 10,
        @Query('sort', new ParseEnumPipe(SORT_OPTION))
        sort: SORT_OPTION = SORT_OPTION.ASC,
      ) {
        return { page, size, sort };
      }

     

    테스트

    1. page, size, sort 변수값을 입력하지 않을 경우 ==> 실패

    응답

    {

    "statusCode": 400,

    "message": "Validation failed (enum string is expected)",

    "error": "Bad Request"

    }

     
    2. page, size, sort의 타입이 일치하지 않는 경우 ==> 성공
    응답
    {
    "statusCode": 400,
    "message": "Validation failed (enum string is expected)",
    "error": "Bad Request"
    }
     
     
    결과: page, size의 변수값을 입력 후 요청한 경우 의도하지 않은 응답을 받는다. 에러가 발생할 확률이 높다. -> 실패 

    3. page, size, sort 변수 중 일부를 제외한 요청에 정상 작동해야 한다 ==> 실패

    • sort = 'ASC'로 요청하면 page, size 변수의 pipeLine을 통과하지 못해 에러 발생
    • page=1, size=10로 요청할 경우도 pipeLine에 의해 통과하지 못해 에러 발생

     

    @Query() 변수에 PipeLine을 추가한 후 DefaultValuePipe 기본값을 설정한 후 리턴

    실험코드

      @Get('find')
      async findAll(
        @Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number,
        @Query('size', new DefaultValuePipe(10), ParseIntPipe) size: number,
        @Query(
          'sort',
          new DefaultValuePipe(SORT_OPTION.ASC),
          new ParseEnumPipe(SORT_OPTION),
        )
        sort: SORT_OPTION,
      ) {
        return { page, size, sort };
      }

     

    테스트

    1. page, size, sort 변수값을 입력하지 않을 경우

    응답

    {

    "page": 1,

    "size": 10,

    "sort": "ASC"

    }

    -> default 값이 정상적으로 리턴 -> 성공

     
    2. page, size, sort의 타입이 일치하지 않는 경우
    응답
     -> 에러를 리턴 -> 성공

    3. page, size, sort 변수 중 일부를 제외한 요청에 정상 작동해야 한다

    -> 성공

     

    결론

    DefaultValuePipe, ParsePipe를 사용하여 queryString을 조작하자
Designed by Tistory.