현재 진행중인 첫 프로젝트에서 아래와 같은 에러가 발생했다.
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
의 사용법을 조금 더.. 훨씬 더 많이 익혀야할 것 같다.