Sequelize "id" has invalid "undefined" 에러

otter·2021년 10월 23일
1

simpleProblem

목록 보기
2/4

현재 진행중인 첫 프로젝트에서 아래와 같은 에러가 발생했다.

UnhandledPromiseRejectionWarning: Error: WHERE parameter "id" has invalid "undefined" value

어려운 내용도 아니었기에 어떤 부분이 문제라고 이야기하는지는 바로 알 수 있었다.

WHERE의 파라미터인 "id"가 "undefined"를 참조한다는 이야기였다.

하지만 대부분의 에러가 어떤 위치에서 발생했는지 알려줬던 기억과는 다르게 위 에러는 모듈만을 가리키고 있어서 해결하는데 어려움을 겪었다.

해결 시도

우선 에러가 발생했다고 짐작가는 부분은 있었다.

await user.findOne({
        include: [
          { model: mileage, attributes: ["mileage"] }
        ],
        where: { email: data.email }
      })
      .then((user) => {
        user.mileages[0].decrement('mileage', { by: purchasedItem.cost });
      })

위 코드를 수정한 뒤에 에러가 발생했기 때문에 당연하게도 저 부분이 문제일 것이라 예상할 수 있었다.

user 테이블을 참조하는 mileage 테이블의 mileage를 감소시키고자 하였는데,

에러가 발생한 것이었다.

가장 이해가 되지 않았던 부분은 id 값을 참조하는 부분이 존재하지 않는데 도대체 어디서 undefined를 받게 되는 것인지...

처음에는 위 코드를 수정하게 되면서 다른 부분의 코드와 충돌이 생긴건 아닐까싶어 각각 id를 참조하는 다른 함수들을 수정했다.

하지만 결과는 달라지지 않았다...

해결 과정

그러던 중, 위 코드를 조금 더 자세히 살펴 보았더니 mileage 모델을 참조해서 값을 가져오긴 하지만,

해당하는 위치가 정확히 어딘지 알 수 있는 정보가 담겨 있지 않아 순간 의아함을 느꼈다.

그 느낌은 틀리지 않았다.

나는 mileage 모델의 특정 값을 감소 시키고 싶었다.

그리고 user.findOne()include를 통해 그 값들을 모두 가져왔다.

하지만, 불필요한 값을 굳이 빼려고 했던 것이 화근이었다.

감소 시켜야 할 위치의 id 값이 존재하지 않아 특정할 수가 없었던 것이었다...!

그래서 아래와 같이 코드를 조금 고쳐줬다.

await user.findOne({
        include: [
          { model: mileage }
        ],
        where: { email: data.email }
      })
      .then((user) => {
        user.mileages[0].decrement('mileage', { by: purchasedItem.cost });
      })

굳이 attributes를 사용하지 않고 모든 값을 참조하니 에러가 말끔히 해결되었다.

include의 사용법을 조금 더.. 훨씬 더 많이 익혀야할 것 같다.

0개의 댓글