inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)

로그아웃 코드 관련해서 질문드립니다

해결된 질문

193

최상현

작성한 질문수 4

0


 function useLogout(mutationOptions?: UseMutationCustomOptions) {
    return useMutation({
        mutationFn: logout,
        onSuccess: () => {
            console.log("before storage empty: ", getEncryptStorage(storageKeys.ACCESS_TOKEN));
            removeHeader('Authorization');
            removeEncryptStorage(storageKeys.REFRESH_TOKEN);
            queryClient.resetQueries({queryKey: [queryKeys.AUTH]});
            console.log("storage empty: ", getEncryptStorage(storageKeys.ACCESS_TOKEN));
        },
        ...mutationOptions,
    });
}

이게 강사님께서 쓰신 로그아웃 코드인데 removeEncryptStorage를 비동기 함수로 구현하셨었습니다.

제가 로그아웃 버튼을 누르는데 'localhost:제가 만든 서버 포트':auth/logout 이런식으로 클라이언트에 요청했을 때

로그를 살펴보니깐
LOG Access token after remove: {"_h": 0, "_i": 0, "_j": null, "_k": null}

LOG Access token removed: false

LOG isLogIn: false //이건 Navigation/root/RootNavigator.tsx에 isLogin값이 false인지 true인지 확인하기 위해 콘솔로그 찍음

이런식으로 출력되었었습니다.

로그아웃 직후에 바로 로그인이 된 상태로 작동했습니다.

 

removeEncryptStorage는 비동기 함수이기 때문에 await 없이 호출되면 로그아웃 관련된 비동기 작업이 완려되기 전에

onSuccess내의 코드들이 실행된거 같습니다.

function useLogout(mutationOptions?: UseMutationCustomOptions) {
    return useMutation({
        mutationFn: async () => {
            removeHeader('Authorization');
            await removeEncryptStorage(storageKeys.REFRESH_TOKEN);
        },
        onSettled: () => {
            // 관련 쿼리 무효화하여 캐시 초기화
            queryClient.invalidateQueries({queryKey: [queryKeys.AUTH]});
        },
        ...mutationOptions
    });
}

그래서 이런식으로 await async로 토큰 제거 작업이 완료된 후 까지 기다리게 만들어서 하니깐 로그아웃이 잘 작동되고

서버 내에 db랑 연결된 users 테이블 내의 refresh_token도 사라진걸 확인할 수 있었습니다.

 

제가 혹시 놓친 부분이 있었는지 왜 이런 차이가 나는지 정확한 이유를 몰라서 질문 남깁니다.

react-native typescript nestjs react-query zustand

답변 1

0

Kyo

직접 서버를 만드셨고 거기서만 로그아웃이 된다는 말씀인가요?? 그리고 아래써주신 코드는 mutationFn에서 헤더와 스토리지만 지워주고 계시는데, db가 지워지나요?

0

최상현

function useLogout(mutationOptions?: UseMutationCustomOptions) {
    return useMutation({
        mutationFn: async () => {
            const response = await axiosInstance.post('/auth/logout');  // 로그아웃 요청을 서버에 먼저 보냄
            console.log('Logout response:', response.data); // 요청이 성공했는지 확인

            removeHeader('Authorization');// 요청 성공 후 헤더와 스토리지 정리
            await removeEncryptStorage(storageKeys.REFRESH_TOKEN);
            queryClient.resetQueries({queryKey: [queryKeys.AUTH]});
        },
        onSettled: () => {// 관련 쿼리 무효화하여 캐시 초기화
            queryClient.invalidateQueries({queryKey: [queryKeys.AUTH]});
        },
        ...mutationOptions
    });
}

아 죄송합니다 제가 잘못 올렸습니다
현재 이런 코드로 로그아웃을 구현하였고 로그아웃 시에 db의 리프레시 토큰이 삭제가 된걸 확인했습니다

react-native-screens 버전 호환 문제

2

153

1

안드로이드 실행 중 Drawer네비게이션과 MapView 성능 문제

0

103

2

해당 강의 부분은 실제 활용하기에 부족해 제가 해결한 방법입니다.

0

96

1

소스코드가 강의 순서랑 다른가요?

0

72

2

현재 Windows에서 VsCode로 작업 중인데 추후에 IOS도 가능하게 하려면

0

115

2

react-native-fast-image는 react 19 버전에서 설치가 안되나요?

0

209

2

SQL Shell의 역할이 무엇인가요?

0

91

1

혹시 해당 강의에서invalidateQueries를 사용한 이유가 있을까요?

0

79

2

빠르게 실행해보고싶습니다.

0

82

1

강의 수강 순서 관련

0

70

1

애뮬레이터 실행 방법

0

99

2

무료 Apple ID로 실기기 테스트 가능한가요?

0

90

2

ios 실기기 연결

0

70

2

npm run ios에러

0

74

1

10월 삭제 예정인 강의는 이유를 알 수 있을까요?

0

101

1

캘린더 개발 후에 navigation 에 대해서 궁금한 점이 있습니다.

0

51

1

안드로이드 위치 권한 이슈 2가지 문의

0

71

1

지도가 보이려면 음.. 작성해주신 스타일과 다르게

0

74

0

제대로 설치한거같은데 안드로이드랑 ios 둘다 앱실행이 안되는것같아요

0

83

3

강의 내용을 보면 전체적으로 function 함수 키워드를 사용하시는데

0

69

2

강의 3-9 에서 useGetRefreshToken 훅 안에 즉시 함수로 처리하는 이유가 궁금합니다!

0

82

2

사내에서 figma.com 업로드 안되나요?

0

96

1

AWS EC2 + RDS 설정

0

85

2

안드로이드 안켜집니다.

0

91

2