Merge branch 'main' into style

This commit is contained in:
yoon 2025-03-18 10:30:15 +09:00
commit 900d1d21a5
2 changed files with 49 additions and 19 deletions

View File

@ -40,7 +40,31 @@ $api.interceptors.response.use(
function (response) { function (response) {
const loadingStore = useLoadingStore(); const loadingStore = useLoadingStore();
loadingStore.stopLoading(); 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; return response;
}, },
function (error) { function (error) {
@ -48,17 +72,24 @@ $api.interceptors.response.use(
loadingStore.stopLoading(); loadingStore.stopLoading();
const toastStore = useToastStore(); const toastStore = useToastStore();
// 오류 응답 처리 // 로그인 요청 별도 처리 (헤더에 isLogin이 true로 설정된 경우)
if (error.response) { 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) { switch (error.response.status) {
case 400: case 400:
toastStore.onToast('잘못된 요청입니다.', 'e'); toastStore.onToast('잘못된 요청입니다.', 'e');
router.push('/error/400'); // 🚀 400 에러 발생 시 자동 이동 router.push('/error/400');
break; break;
case 401: case 401:
if (!error.config.headers.isLogin) { toastStore.onToast('인증이 필요합니다.', 'e');
// toastStore.onToast('인증이 필요합니다.', 'e');
}
router.push('/login'); router.push('/login');
break; break;
case 403: case 403:
@ -76,10 +107,8 @@ $api.interceptors.response.use(
toastStore.onToast('알 수 없는 오류가 발생했습니다.', 'e'); toastStore.onToast('알 수 없는 오류가 발생했습니다.', 'e');
} }
} else if (error.request) { } else if (error.request) {
// 요청이 전송되었으나 응답을 받지 못한 경우
toastStore.onToast('서버와 통신할 수 없습니다.', 'e'); toastStore.onToast('서버와 통신할 수 없습니다.', 'e');
} else { } else {
// 요청 설정 중에 오류가 발생한 경우
toastStore.onToast('요청 중 오류가 발생했습니다.', 'e'); toastStore.onToast('요청 중 오류가 발생했습니다.', 'e');
} }
@ -87,4 +116,5 @@ $api.interceptors.response.use(
}, },
); );
export default $api; export default $api;

View File

@ -71,17 +71,17 @@
remember: remember.value, remember: remember.value,
}, { headers: { isLogin: true } }) }, { headers: { isLogin: true } })
.then(async res => { .then(async res => {
if (res.status === 200) { // (success false )
if (res.data && res.data.success === false) {
//
errorMessage.value = res.data.message || '로그인에 실패했습니다.';
return;
}
//
userStore.userInfo(); userStore.userInfo();
await nextTick(); await nextTick();
router.push('/') router.push('/');
} })
}).catch(error => {
if (error.response) {
error.config.isLoginRequest = true;
errorMessage.value = error.response.data.message;
console.clear();
}
});
}; };
</script> </script>