adonis / updateQs 주의사항

7167 단어 2021.092021.09

🔮 사건 발단

adonis 공식문서에서 updateQs 관련 내용을 위처럼 확인할 수 있다.

조건이 있는 검색에 대해 유효성 검사를 진행하기 위해 updateQs를 활용했다.

updateQs로 JSON으로 들어오는 조건들을 parse 해서 adonis의 validator을 활용했다.

그런데 홈페이지에서 페이지가 변경되지 않는 문제가 발생했다.

2페이지, 3페이지 쿼리를 날려도 1페이지만 화면에 보였다.

🔮 상황 파악


public async searchItem({ request }: HttpContextContract) {
    console.log(request.input('page')) // 여기서는 잘 나옴
    console.log(request.input('perPage')) // 여기서는 잘 나옴
    
    if (request.input('filters')) {
      request.updateQs({filters: JSON.parse(request.input('filters'))})
    }
    await Validator.searchItemValidator(request)
    
    console.log(request.input('page')) // undefined로 찍힘
    console.log(request.input('perPage')) // undefined로 찍힘
    return 검색 결과
  }

코드는 위 처럼 작성했다.

/search?page=2&perPage=10&filters={"color":"yellow"}
이렇게 요청이 들어오면 색깔이 노란색인 데이터를 2페이지 부분을 보내준다.
그런데 updateQs 적용 전에는 데이터가 console에 찍혔는데,
적용 후에는 undefined로 찍혔다.

파악한 바로는 updateQs한 쿼리만 살리고, 나머지 부분을 다 날린다는 것이었다.
모든 쿼리를 updateQs 하는 작업이 필요했다.

🔮 시도 1 (실패)

updateQs를 쓰지말고, filters 를 JSON.parse해서 따로 validatior 에 넣는 방법

adonis 의 경우, validator은 request형식의 데이터에만 쓸 수 있다.
이런 식으로 진행할거면 직접 validatior을 커스텀하는 방법.. -> 협업에 굉장히 불편

🔮 시도 2 (성공)

모든 쿼리를 updateQs하는 방법

request 형식 데이터를 할당해서, 가공 후에 updateQs 를 적용하는 방법이다.

// 이전코드
request.updateQs({filters: JSON.parse(request.input('filters'))})

// 새로 작성한 코드
let data = request.all() //{ page: '2', perPage: '10', filters: '{"color":"yellow"}' }
data['filters'] = JSON.parse(request.input('filters'))
request.updateQs(data)

이렇게 변경하니 에러없이 잘 작동했다.

🔮 후기

시도 1은 내가 생각해낸 방법이고,
시도 2는 동료분이 생각해낸 방법이다. (최고!!)

공식문서에도 updateQs에 대해 있는 부분이 저거 하나뿐이라서,
능숙하게 사용하는 게 힘들었다.

다른 소스코드를 참고하면서 익힌 수준이라서,
시도 2를 생각해 낼 수 없던 내 자신이 .. ㅠ (뭐 그럴수도 있지 !!)

기존 코드를 봤을 때, 객체를 넣으면 그 객체가 request 내에서 업데이트 된다는 걸 깨달았어야 했다.
request.all()을 활용한 것도 인상깊었다.
시간날 때마다 공식문서를 구석구석 읽어봐야겠다.

시도 2를 바로 생각해 낸 동료님이 짱이다.
열심히 받아적고 익혀서 이런 생황에 시도 2를 생각해낼 수 있는 개발자가 될 것이다.

좋은 웹페이지 즐겨찾기