AxiosでJavaScriptの約束をより良く理解しようとしています。私は、Request.jsのすべてのエラーを処理し、catch()
を使用せずに、どこからでもリクエスト関数を呼び出すだけです。
この例では、要求に対する応答は400で、JSONのエラーメッセージが含まれます。
これは私が得ているエラーです:
Uncaught (in promise) Error: Request failed with status code 400
私が見つける唯一の解決策は、Somewhere.jsに.catch(() => {})
を追加することですが、そうすることを避けようとしています。出来ますか?
コードは次のとおりです。
Request.js
export function request(method, uri, body, headers) {
let config = {
method: method.toLowerCase(),
url: uri,
baseURL: API_URL,
headers: { 'Authorization': 'Bearer ' + getToken() },
validateStatus: function (status) {
return status >= 200 && status < 400
}
}
...
return axios(config).then(
function (response) {
return response.data
}
).catch(
function (error) {
console.log('Show error notification!')
return Promise.reject(error)
}
)
}
Somewhere.js
export default class Somewhere extends React.Component {
...
callSomeRequest() {
request('DELETE', '/some/request').then(
() => {
console.log('Request successful!')
}
)
}
...
}
実際、現時点ではaxiosでは不可能です。 _2xx
_の範囲にのみ該当するステータスコードは、.then()
でキャッチできます。
従来のアプローチは、次のようなcatch()
ブロックでエラーをキャッチすることです。
_axios.get('/api/xyz/abcd')
.catch(function (error) {
if (error.response) {
// Request made and server responded
console.log(error.response.data);
console.log(error.response.status);
console.log(error.response.headers);
} else if (error.request) {
// The request was made but no response was received
console.log(error.request);
} else {
// Something happened in setting up the request that triggered an Error
console.log('Error', error.message);
}
});
_
別のアプローチは、thenまたはcatchによって処理される前に要求または応答をインターセプトすることです。
_axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
_