axios 요청이 길어질 때 요청을 중단하고, timeout 처리를 하고 싶다면 요청 config에 timeout
설정을 해주어야 합니다.
axios 요청에서 timeout
은 기본적으로 0
(무한대)이기 때문에,
반드시 설정하는 것이 좋겠습니다.
그럼 interceptors.request
를 이용해 timeout
을 설정하는 방법을 예시 코드와 함께 알아보겠습니다.
예시는 config.method
조건을 추가하여 get
메서드일 때만 설정하였습니다.
// axios 인스턴스 생성
const instance = axios.create({
baseURL: '<https://api.example.com>',
headers: {
...
},
// 조건문 없이 모든 요청에 대해 일괄 적용하고 싶다면 인스턴스 생성 시 설정하면 됩니다.
// timeout: 5000,
});
// request가 발생했을 때 실행될 interceptors를 추가
instance.interceptors.request.use(
// config는 요청에 대한 정보가 담긴 객체입니다. 궁금하면 console로 찍어보세요.
(config) => {
// config.method를 조회하여 get 메서드일 때만 timeout을 설정합니다.
if (config.method === 'get') {
**config.timeout = 12000;**
}
return config;
},
(error) => {
...
},
);
timeout 설정을 마치면 axios 요청이 길어질 때 요청이 중단되고 error
가 반환됩니다.
그리고 code
값이 ECONNABORTED
로 오기 때문에 이를 조건으로 사용해 처리하면 되겠습니다.
// 응답 인터셉터 추가하기
axios.interceptors.response.use(function (response) {
// 2xx 범위에 있는 상태 코드는 이 함수를 트리거 합니다.
// 응답 데이터가 있는 작업 수행
return response;
}, function (error) {
// 2xx 외의 범위에 있는 상태 코드는 이 함수를 트리거 합니다.
// 응답 오류가 있는 작업 수행
const code = error.code;
const status = error.response?.status;
// timeout이 발생한 경우와 서버에서 408 에러를 반환할 때를 동시에 처리하겠습니다.
if (code === "ECONNABORTED" || status === 408) {
alert("요청이 만료되었습니다.");
}
return Promise.reject(error);
});
<aside> 💡 테스트가 필요하다면 timeout을 100으로 잡고 호출해보세요.
</aside>
<aside>
🚨 주의할 점
timeout 오류 발생 시 error.response
는 undefined
가 됩니다.
interceptors 안에서 error.response.status
처럼 response
안에 있는 값을 꺼내어 쓰는 코드가 있다면 오류가 발생됩니다.
옵셔널 체이닝 문법을 이용하거나 error.response
에 대해 별도의 조건 처리가 필요합니다.
</aside>
<aside> ✅ axios 0.21.1 버전에서 작성되었습니다.
</aside>