I'm using "axios": "^0.18.0"
I am intercepting requests and responses and I'm adding token when intercepting requests.
when I use request interceptor then in response interceptor if I get [400,...] error my "error.response.data" is undefined and I don't have access to exception types and messages to translate them
when I remove request interceptor it works correctly but I need request interceptor to add token
axiosAuthInstance.interceptors.request.use((config)=>{
console.log('Auth req config=>', config.url);
console.log('auth req ',config);
const token = store.getState().tokenReducer.access_token;
console.log(token);
if (token != null || token !== '.') {
config.headers.Authorization = `Bearer ${token}`;
console.log('authed');
}
return config;
},(error)=>{
ToastMaker().withoutAction('Ooops Error in Auth Request Interceptor','warning');
console.log(error);
return Promise.reject(error);
});
//------------------------------------------
axiosAuthInstance.interceptors.response.use((response)=>{
console.log('Auth resp response=>',response);
if (response.data.error) {
console.log('hereeeeeee !!!');
// return Promise.reject(response);
}
return response;
},(error)=>{
switch(error.response.status){
case 400:{
console.log(error.response.data.customExceptionDetailModelList);
error.response.data.customExceptionDetailModelList.forEach((item)=>{console.log(item.message.error)});
ToastMaker().withoutAction(`${error.response.status}` + " "+error.response.data.error_description,'warning');
break;
}
case 401:{
console.log('shafffft');
console.log(error.response.data.customExceptionDetailModelList);
error.response.data.customExceptionDetailModelList.forEach((item)=>{console.log(item.message.error)});
ToastMaker().withoutAction(`${error.response.status}` +" "+error.response.data.error_description,'warning');
break;
}
case 404:{
console.log(error.response.data.customExceptionDetailModelList);
error.response.data.customExceptionDetailModelList.forEach((item)=>{console.log(item.message.error)});
ToastMaker().withoutAction(`${error.response.status}` + " "+error.response.data.error_description,'warning');
break;
}
case 500:{
ToastMaker().withoutAction(`${error.response.status}` +" "+error.response.data.error_description,'warning');
break;
}
default:{
ToastMaker().withoutAction('مشکل ارتباط با سرور','warning');
break;
}
}
console.log(error.response);
return Promise.reject(error);
});
this is how it works without request.intercept

and here is what it looks like after using request interceptor

In my experience, error.response is not defined when the server (for some reasons) fails to respond (e.g. Timeout). Therefore you don't get any status code nor error message.
I usually cope with both the situations:
axios.interceptors.response.use(response => {
return response
}, error => {
if (!error.response) {
// Show a generic error Toast (e.g. Server error, please retry)
return
}
const { response: { status } } = error
if (status === 401) {
// Refresh token
}
return Promise.reject(error)
})
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With