사실 너무 어이없는 이유로 에러를 맞닥뜨렸는데 혹.. 미래의 나를 포함한 누군가에게 도움이 될 수 있지 않을까 하여 적어본다.
filter, find 배열 메서드는 오류의 이유가 뻔하다. 메서드 앞의 객체가 배열이 아닌 값이기 때문에 함수를 호출할 수 없는 것이다. 관건은 배열이 아니면 대체 뭐가 담겼느냐! 인데..
값이 undefined 된 경우를 고려해 조건식 등을 걸어두면 해결된다는 글이 꽤 보였지만 그 어떤 걸 적용해도 답을 찾을 순 없었다.
자포자기하는 심정으로 챗gpt에게 냅다 파일 세 개 보여줄 테니 뭐가 문제인지 찾아달라고 했다.
이전엔 정말 에러다운 에러(?)를 만났는데 진짜 글자 하나 뒤바뀐 걸로 이렇게 삽질하는 경험을 하게 되었다. 그래선가. 분노보다는 왠지 모를 웃음이 비집고 나오던데..
무튼 스펠링만 고쳐서
// deatil.js
function Detail (props) {
let {id} = useParams();
let pickProd = props.product.find(function(prod){
return prod.id === id});
return (
// 생략
<h4>{props.product[pickProd.id].title}</h4>
<p>{props.product[pickProd.id].content}</p>
<p>{props.product[pickProd.id].price}원</p>
<button className="btn btn-danger">주문하기</button>
// 생략
다시 확인해봤다.
하지만 다시금 만난 에러.
TypeError: Cannot read properties of undefined (reading 'id')
return문의 id는 find 메서드를 사용한 변수(pickProd)의 프로퍼티다. 그럼 find에 달아둔 조건(prod.id === id
)에 문제가 있다는 의미겠다.
확인 차 콘솔창을 찍어봤다.
// deatil.js
function Detail (props) {
let {id} = useParams();
let pickProd = props.product.find(function(prod){
return prod.id == id});
console.log(typeof pickProd.id); // number (from data.js)
console.log(typeof id); // string (from url)
id는 url 파라미터로 가져온 값이다. 그래서인지 string 타입이다. 반면 data 파일의 id는 1부터 increment하는 숫자다.
타입을 하나로 맞추어 일치연산자를 고수할 수 있긴 하지만, 타입까지 정확히 맞는 게 중요한 상황이 아니라서 동등 연산자로 충분하다는 생각이 들었다.