hero_picture
Cover Image for axiosのエラーハンドリング共通化について 一部共通化したくない場合

axiosのエラーハンドリング共通化について 一部共通化したくない場合

2024/09/17

こんにちは、システム開発事業部の加藤です

axiosでの処理の共通化について、特定のAPIでは処理を共通化したくない場合があり、どう対応するか考えることがあったので共有します

axiosでの処理の共通化

axiosにはintercepterという機能があり、リクエストを送る前とレスポンスを受け取った後で、データを処理したり、特定のエラーハンドリングを登録することができます

各処理を共通化したい際に便利な機能です

1
2// レスポンスインターセプターの設定
3axios.interceptors.response.use(response => {
4  // レスポンスデータに対する処理
5  return response;
6}, error => {
7  // レスポンスエラーに対する処理
8  console.error('Error status:', error.response.status);
9  console.error('Error data:', error.response.data);
10  return Promise.reject(error);
11});
12

特定のAPIで共通のハンドリングを利用しない場合

一部のAPIでは共通化したハンドリングを通したくない場合です

例えば以下のようにエラー時にアラートを表示するような書き方をしていた場合、すべてのaxiosを使った呼び出しでアラートが表示されます

しかし、特定のapiではエラー時にモーダルを表示させたくない場合があるかもしれません

1axios.interceptors.response.use(response => {
2  return response;
3}, error => {
4  // エラーのアラートを表示
5  alert('エラー');
6  return Promise.reject(error);
7});

引数から渡した変数を、 インターセプターで条件分岐

axiosで引数を指定した場合、インターセプター内でconfig 変数から受け取れます

インターセプター内でconfigオブジェクトをチェックし、定義したプロパティに基づいて処理の実行を切り替えます

1axios.get('/some-endpoint', {
2  ignoreInterceptors: true  // intercepterを使わずに個別でエラーハンドリングを行いたい
3}).catch((error) => {
4  // 
5})

1axios.interceptors.response.use(response => {
2  return response;
3}, error => {
4  if (error.config.ignoreInterceptors) {
5	  return Promise.reject(error);
6  }
7  alert('エラー');
8  return Promise.reject(error);
9});
10

intercepterに書かずに、管理を外部で行う

エラーハンドリングをインターセプタではなく、外部で定義し、それをAPIのcatchで利用します

すべてのapiでハンドリングを書かないといけないので、対応が漏れてしまうかもしれません

1const handleError = (error) => {
2  alert('エラー');
3}
4
5axios.get('/some-endpoint').catch(handleError);
6
7
8// 共通化したエラーハンドリング関数を利用しない場合は個別に定義する
9axios.get('/some-endpoint').catch((e) => {
10	// 個別で実行したい何かしらの処理
11});

別のaxiosインスタンスを用意する

インターセプタを適用したくないリクエストのために、新しい Axios インスタンスを作成し、そのインスタンスにはインターセプタを設定しないようにします

1// インターセプタなしの axios インスタンス
2const axiosWithoutInterceptor = axios.create();
3
4axiosWithoutInterceptor.get('/some-endpoint');

まとめ

共通化していて、一部例外対応が必要な場合は、configに渡す方法が綺麗なのかなと思いました