Reputation: 579
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
Upvotes: 3
Views: 7211
Reputation: 579
problem was adding "Bearer null" to headers.
const token = store.getState().tokenReducer.access_token;
if (token != null) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
removing if statement solved the problem. wrong headers were giving me wrong error codes
Upvotes: 0
Reputation: 809
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)
})
Upvotes: 1