[여기에 에러를 입력] - 리액트 첫 프로젝트에서 만난 에러모음(3)
last update: 2021.08.25.WED
리액트 첫 프로젝트에서 만난 에러 모음(3)
[여기에 에러를 입력]
- 수정 : 지난번 에러모음(2)에서 반려CORS 에러 운운했는데 이번 프로젝트에 사용하는 API가 아무렇게나 뱉는 에러 메시지여서 그렇다고 한다. 원래는 헤더 수정을 하는 등 인터넷에 많이 나오는 방법대로 하면 해결이 되는 게 맞고, 이렇게 쉽게(?) 무시할 수 있는 에러도 아닌 거 같다.
- 프로젝트 후반으로 오니 오히려 에러 메시지가 반가워졌다. 이렇다할 에러가 안 나오는데 결과 데이터가 이상하게 꼬여버리기 시작하니 뇌와 미간의 주름이 깊어지기 시작했다.
1) key prop
Warning: Each child in a list should have a unique "key" prop.
- key 추가하는 걸 깜빡했다. Date.now()로 키를 바꿔봤더니, 다음 에러가 발생했다.
Warning: Encountered two children with the same key, 1629775901666. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.
- 1629775901666는 Date.now()로 얻은 값이다.
- 5개 컴포넌트에 데이터만 각기 순차적으로 다르게 하여 화면에 렌더링 하는 구조였다.
- 컴포넌트마다 입력 데이터도 출력 결과물도 다를테지만 키는 Date.now()로 같아져 결국 고유성을 부여하는 데에 실패했다.
- 순차적으로 렌더링되면서 유의미한 시차가 생길 것이라 생각했는데 그 정도가 아니었나보다. key는 다른 방식을 사용해야겠다.
- 참고 : React key prop 이해하기
- 이 블로그 글을 보고 도움을 많이 받았다.
- 보통 key값에는 데이터의 id값을 많이 쓴다고 한다.
{data.id}
와 같은 형식으로. 이번 데이터는 그러기가 조금 애매해서 그냥 인덱스를 썼다.
- 참고 : 리액트 공식 문서
- 가급적 공식 문서부터 찾자.
2) type error
.map is not a function
- map은 배열에만 쓸 수 있다. 객체에는 쓸 수 없다.
- 반환되는 자료형도 배열이다.
- 참고 : javascript 공식 문서
- “
map()
메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다.”
Unhandled Rejection (TypeError): Cannot read property '1' of undefined
- 말 그대로
undefined
상태인 데이터가 입력되어서 나는 에러메시지. - 이 에러는 api 서버에서 데이터를 받아와서 가공한 뒤 상태관리 로직에 넣었다가 다시 꺼내오는 과정에서 자주 볼 수 있었다.
- 상태가 변하는 타이밍, 즉 함수가 호출될 타이밍을 잘못 계산한 것 같다. 어젯밤부터 다시 해결하려고 하는데 잘 안되어서 상태관리 로직 대신 일반 함수로 다시 구현하긴 했는데, 방법을 더 찾아야겠다.
- 상태가 변할 필요, 즉 렌더링이 더 필요한지 아닌지 더 깊게 생각해봐야겠다.
- 말 그대로
typeof(blahblah) 또는 typeof blahblah
사용하기- 에러가 뜬다 싶으면 우선 지금 내가 보내고 받는 자료형이 뭔지 확인하기 시작했다.
- (이제서야!)
3) no-unused-expressions
Expected an assignment or function call and instead saw an expression no-unused-expressions
- 참고 : ESLint 공식 문서
- 분명히 사용을 하는 함수였는데 사용되지 않는 표현식에 대한 경고가 나왔다.
- 문제는 함수와 화살표 함수를 섞어쓰다가 리턴값을 제대로 살펴보지 않았다는 데에 있었다.
- 참고 : 화살표 함수 사용 시 주의사항
- 참고 : MDN 공식 문서 - 화살표 함수
// 화살표 함수의 유일한 문장이 'return'일 때 'return'과 // 중괄호({})를 생략할 수 있다. elements.map(element => element.length); // [8, 6, 7, 9]
- MDN의 예제를 보면 화살표 함수도 일반 함수와 마찬가지로 중괄호{}를 사용하나, return과 중괄호를 생략할 때만 소괄호()로 나타낼 수 있다. 이걸 제대로 숙지하지 않고 무턱대고 썼다가 경고장이 떴다.
- 참고 : ESLint 공식 문서