useQuery와 useMutation을 사용하던 중, 에러가 발생했다.
에러는 Mutation이후 queryClient.invalidateQueries가 동작하지 않아 useQuery가 실행되지 않는 것.
Mutation을 사용할 기능은 이미지를 저장하는 기능인데,
이미지를 File base로 변환 후 post를 보내면, mutation이후 get이 요청되는 것이 아니라, get요청 이후 post가 들어간다.
우선 queryClient.invalidateQueries가 동작하지 않는 몇몇 경우를 살펴보자
1.enabled를 사용했을때.
2. 오타 등의 이유로 Key값이 다를 때.
3.리렌더링 과정에서 queryClient가 stable하지 않을 때.
1,2,3)-https://stackoverflow.com/questions/68577988/invalidate-queries-doesnt-work-react-query
4.해당 컴포넌트가 unmout 됐을 때.
5. 키가 아직 stale하다고 판단 되었을 때.
하지만 아쉽게도 위에 모두 내가 가진 오류를 고치진 못했다.
이후 몇 시간 동안 삽질이 계속되었다.
이미지를 올리고 내리고를 네트워크 탭을 보며 반복하고 있을 때, 문든 든 생각이 있었다.
Post요청 이전에 Get요청을 보내는 이유가 뭘까?
우선 use-query에는 자동으로 get요청을 보내는 옵션들이 있었다.
윈도우에 포커스가 맞춰지면 자동으로 보내지는 refetchOnWindowFocus,
refetchOnMount 등등 (use-query 옵션
const { mutate, onSuccess, isLoading } = useMutation(
(params) => {
return axios.post(`${APIADDRESS}/~~`, params);
},
{
onSuccess: () => {
const params = {
//parameters
};
return queryClient.invalidateQueries(["key"]);
},
onError: (err) => {
console.log(err);
},
}
);
const res = useQuery(["get_log", params], queryFn, {
onSuccess,
});
결론부터 말하자면 refetchOnWindowFocus를 false로 설정하며 에러는 수정됐다.
아래서부턴 에러의 원인을 찾지 못해 에러가 발생한 이유에 대한 개인적인 생각이다.
mutation의 사용 이유는 이미지를 post하기 위해서다.
이미지는 드래그앤 드롭기능을 넣었지만, 직접 파일을 선택하는 경우 Focus가 맞춰지지않는다.
파일을 선택한 이후 Focus는 다시 해당 WIndow로 맞춰지고, refetch가 일어나 get요청이 발생한다.
그 이후 Filebase를 거친 이미지가 mutation으로 post요청되는데, 그 이전에 발생한 get요청 때문에 stale하다고 판단,
(stale은 0이지만 아마 컴퓨터의 연산 속도를 생각하면 0.0000000...초 차이일 것으로 생각된다.)
get요청을 보내지 않고 키값이 가지고 있는 정보를 뿌리게 된다고 생각된다.
정확하지 않은 추측성 정보임에 만족하지 않고 좀 더 정확한 이유를 찾아야겠다.
'자바스크립트' 카테고리의 다른 글
자바스크립트) 객체의 복사 (0) | 2023.05.30 |
---|---|
React) 구글 로그인 - @react-oauth/google (0) | 2023.03.30 |
AWS S3 이미지 업로드 with React (0) | 2023.01.25 |
React)Discord 로그인 (with Supabase) (0) | 2023.01.11 |
use-query)useInfiniteQuery를 사용해보자. (0) | 2022.12.29 |