From 1fcff891761fde06d1476c58e6ae4b60b339a275 Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 18 Mar 2025 10:28:30 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BB=A4=EC=8A=A4=ED=85=80=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/axios-interceptor.js | 48 +++++++++++++++++++++++++------ src/components/user/LoginForm.vue | 20 ++++++------- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/common/axios-interceptor.js b/src/common/axios-interceptor.js index b1e6b52..68e9bd4 100644 --- a/src/common/axios-interceptor.js +++ b/src/common/axios-interceptor.js @@ -40,7 +40,31 @@ $api.interceptors.response.use( function (response) { const loadingStore = useLoadingStore(); loadingStore.stopLoading(); - // 2xx 범위의 응답 처리 + + // 로그인 실패, 커스텀 에러 응답 처리 (status는 200 success가 false인 경우) + if (response.data && response.data.success === false) { + const toastStore = useToastStore(); + const errorCode = response.data.code; + const errorMessage = response.data.message || '알 수 없는 오류가 발생했습니다.'; + + // 로그인 요청일 경우 (헤더에 isLogin이 true로 설정된 경우) + if (response.config.headers && response.config.headers.isLogin) { + return response; + } + + // 서버에서 보낸 메시지 사용 + toastStore.onToast(errorMessage, 'e'); + + // 특정 에러 코드에 대한 추가 처리만 수행 + if (errorCode === 'USER_NOT_FOUND') { + router.push('/login'); + } + + // 오류 응답 반환 + return response; + } + + // 일반 성공 응답 처리 return response; }, function (error) { @@ -48,17 +72,24 @@ $api.interceptors.response.use( loadingStore.stopLoading(); const toastStore = useToastStore(); - // 오류 응답 처리 - if (error.response) { + // 로그인 요청 별도 처리 (헤더에 isLogin이 true로 설정된 경우) + if (error.config && error.config.headers && error.config.headers.isLogin) { + // 로그인 페이지 오류 토스트 메시지 표시 X + return Promise.reject(error); + } + + // 에러 응답에 커스텀 메시지가 포함되어 있다면 해당 메시지 사용 + if (error.response && error.response.data && error.response.data.message) { + toastStore.onToast(error.response.data.message, 'e'); + } else if (error.response) { + // 기본 HTTP 에러 처리 switch (error.response.status) { case 400: toastStore.onToast('잘못된 요청입니다.', 'e'); - router.push('/error/400'); // 🚀 400 에러 발생 시 자동 이동 + router.push('/error/400'); break; case 401: - if (!error.config.headers.isLogin) { - // toastStore.onToast('인증이 필요합니다.', 'e'); - } + toastStore.onToast('인증이 필요합니다.', 'e'); router.push('/login'); break; case 403: @@ -76,10 +107,8 @@ $api.interceptors.response.use( toastStore.onToast('알 수 없는 오류가 발생했습니다.', 'e'); } } else if (error.request) { - // 요청이 전송되었으나 응답을 받지 못한 경우 toastStore.onToast('서버와 통신할 수 없습니다.', 'e'); } else { - // 요청 설정 중에 오류가 발생한 경우 toastStore.onToast('요청 중 오류가 발생했습니다.', 'e'); } @@ -87,4 +116,5 @@ $api.interceptors.response.use( }, ); + export default $api; diff --git a/src/components/user/LoginForm.vue b/src/components/user/LoginForm.vue index 32e7999..d87eb00 100644 --- a/src/components/user/LoginForm.vue +++ b/src/components/user/LoginForm.vue @@ -71,17 +71,17 @@ remember: remember.value, }, { headers: { isLogin: true } }) .then(async res => { - if (res.status === 200) { + // 로그인 실패 확인 (success가 false인 경우) + if (res.data && res.data.success === false) { + // 로그인 실패 시 에러 메시지 표시 + errorMessage.value = res.data.message || '로그인에 실패했습니다.'; + return; + } + + // 로그인 성공 처리 userStore.userInfo(); await nextTick(); - router.push('/') - } - }).catch(error => { - if (error.response) { - error.config.isLoginRequest = true; - errorMessage.value = error.response.data.message; - console.clear(); - } - }); + router.push('/'); + }) };