[Error] doc 사용 시 n.indexOf is not a function 에러
본문 바로가기
더 알아보기/에러

[Error] doc 사용 시 n.indexOf is not a function 에러

by 은돌1113 2021. 12. 1.

키워드 : doc -> 참조 데이터 / n.indexOf is not a function 오류

 

1) doc으로 받아온 반환값은 타입이 document(문서)이기 때문에 참조 데이터이다.

const docRef = doc(db, 'dictionary', dictionary_id)

참조값은 데이터를 받아와서 사용 할 수 없기 때문에

(await getDoc(docRef))

를 사용해서 docRef에 해당하는 데이터를 불러오면 promise 형태로 넘어온다.

(await getDoc(docRef)).data()

거기서 내가 원하는 값은 딕셔너리의 형태의 데이터이기 때문에 .data()를 사용한다.

 

2) 글 작성 후 새로고침 없이 수정이나 삭제를 할 경우 에러 발생

(새로고침을 하면 수정과 삭제가 에러 없이 잘 실행 된다.)

 

(문제점)

: 함수형 컴포넌트에서 useEffect()를 사용해서 컴포넌트가 처음 생성되면 dispatch(loadDictionaryFB())를 사용해서

firebase에 있는 값을 불러왔다.

 

(과정)

1) 컴포넌트가 ComponentMount() 될 때는 firestore(서버)에서 값을 받아 온다.

2) 글을 작성하고 수정이나 삭제 버튼을 누르면 n.indexOf is not a function 오류가 발생한다.

그런데 글 작성 후 새로고침을 하면 수정이나 삭제가 잘 된다.

3) ComponentDidMount() 될 때 데이터를 불러오는 데, ComponentWillMount() 때는 데이터를 못불러 올까라고 생각함

4) useEffect 코드를 다시 봤더니 

  React.useEffect(() => {
    dispatch(loadDictionaryFB());
  }, [])

ComponentWillMount()가 일어나는 조건을 넣어주지 않았다. [] 안에 어떤 값이 변경 되었을 때 ComponentWillMount()를 실행 할 지 넣어줘야 하는 데 그게 없어서 계속 ComponentDidMount() 때만 loadDictionaryFB()가 디스패치 됨.

-> 즉, 업데이트 되는 조건을 안넣어 놓고 왜 업데이트 안되지 한 거다.

5) 어떤 변수의 데이터가 변경 될때마다 디스패치가 일어날 지 생각 해다가 store의 값이 바뀌면 ComponentWillMount()가 일어나야 함으로 useInfo를 넣어더니 해결 되었다.

  const useInfo = useSelector((state) => state.dictionary);  
  
  React.useEffect(() => {
    dispatch(loadDictionaryFB());
  }, [useInfo])

 

(해결)

ComponentWillMount가 발생하는 조건 넣어줬더니 해결됨

  React.useEffect(() => {
    dispatch(loadDictionaryFB());
  }, [useInfo])

댓글