728x90
vue 에서 api 호출시 axios 로 호출 되는 모든 api 의 오류를 체크 할수 있는 파일은 interceptor.js 에서 한번에 처리 할수 있다. 그래서 headers 부분도 매번 api 호출 할때마다 적어주는것이 아니라 congif.headers 로 한번에 지정이 가능하다.
아래 예시는 localStorage 에 토큰값을 저장해 두고 api 호출시 토큰값을 헤더에 실어 보내는 예시다. 보통 권한 오류는 401 로 떨어 지기에 401 로 코드를 받았을때 와 403, 404 정도로 분기를 하고 필유시 코드별로 메세지를 지정해 둘수도 있다.
원래는 이렇게 router 가 사용이 가능해야 하는데 안되는 경우도 있으니 참고하는게 좋겠다.
import axios from 'axios';
import store from '@/store'; // Vuex store
import router from '@/router'; // Vue Router
// Axios 인스턴스 생성
const axiosInstance = axios.create();
// 요청 인터셉터
axiosInstance.interceptors.request.use(
(config) => {
const token = localStorage.getItem('token'); // 토큰 가져오기
if (token) {
config.headers.Authorization = `Bearer ${token}`; // Authorization 헤더 추가
}
return config;
},
(error) => {
return Promise.reject(error); // 요청 오류 처리
}
);
// 응답 인터셉터
axiosInstance.interceptors.response.use(
(response) => {
return response; // 응답이 성공적일 경우 응답 반환
},
async (error) => {
if (error.response) {
const status = error.response.status;
// 401 Unauthorized 처리
if (status === 401) {
alert('로그인 세션이 종료되었습니다. 다시 로그인해주세요.');
store.dispatch('auth/logout'); // 로그아웃 액션
router.push('/auth/login'); // 로그인 페이지로 리다이렉트
return Promise.reject(error);
}
// 403 Forbidden 처리
if (status === 403) {
alert('이 작업을 수행할 권한이 없습니다.');
return Promise.reject(error);
}
// 404 Not Found 처리
if (status === 404) {
router.push('/error/404'); // 404 페이지로 리다이렉트
return Promise.reject(error);
}
// 기타 오류 처리
alert(`오류 발생: ${error.response.data.message || '알 수 없는 오류'}`);
router.push('/error/general'); // 일반 오류 페이지로 리다이렉트
} else {
// 네트워크 오류 처리
alert('네트워크 오류가 발생했습니다. 인터넷 연결을 확인해주세요.');
}
return Promise.reject(error); // 오류를 다음으로 전파
}
);
export default axiosInstance;
코드상에서 api 호출 예시는 아래와 같다. intercepter.js 를 먼저 타기 때문에 일괄로 관리하기에 효율적이다.
import axios from '@/path/to/interceptor'; // interceptor.js 경로
// API 요청 예시
axios.get('/api/example')
.then(response => {
// 성공적으로 데이터를 받아온 경우 처리
})
.catch(error => {
// 에러 처리 (여기서는 interceptor가 처리하므로 추가 필요 없음)
});
728x90
'VUE' 카테고리의 다른 글
Vue 3 부모 컴포넌트에서 자식 메서드 호출하기 (0) | 2024.11.17 |
---|---|
vue3 새창으로 링크 걸기 (0) | 2024.11.16 |
vue3 inputbox 에서 enter 키로 다음 inputbox 이동 되는 스크립트 (0) | 2024.07.25 |
window 에서 node 버전 바꾸기 nvm (0) | 2024.05.22 |
vue v-calendar v-date-picker 년도 월 선택 팝업 추가 (0) | 2024.03.27 |