[React] interceptorを使ってHTTP Errorを処理する方法まとめ(Axiosを使ったREST API処理)


はじめに

React.jsでInterceptorを使ってHTTP Errorを一元的に処理する方法の備忘録です。

今回は、HTTPリクエストにAxiosパッケージを使用します

AXIOSのインストール

まずは、AXIOSパッケージをインストールします。
インストール対象のプロジェクトフォルダに移動します。

$ cd my-app1
$ npm install axios

これで、axiosパッケージが利用できるようになりました。

jsファイルを作成する

早速コードを書いていきます。

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import axios from 'axios';
import reportWebVitals from './reportWebVitals';

axios.interceptors.response.use(
  async (response) => {
    if (response.status === 201) {
      console.log('Posted Successfully');
   }
    return response;
  }, error => {
    const {status} = error.response;
    switch (status) {
      case 400:
        console.log(error.response);
        break;
      case 401:
        console.log("Unauthorized");
        break;
      case 404:
        console.log(error.response?.status);
        break;
      case 500:
        console.log("server error");
        break;
      default:
        console.log("an unknown error occurred");
        break;
    }
    return Promise.reject(error);
  },
);

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

axiosパッケージでのPOST処理に成功した場合は201を返します。エラーの場合は場合分けし、console.logに出力します。

App.js

import logo from './logo.svg';
import './App.css';
import React, {useState, useEffect} from 'react';
import axios from 'axios';
import { AxiosError, AxiosInstance, AxiosResponse } from 'axios';

function App() {
  const [data, setData] = useState(null);
  const [val, setVal] = useState('');
  const [fetchData, setFetch] = useState(false);
  useEffect(() => {
    if (fetchData) {
      const payload = {
        method: 'POST',
        body: JSON.stringify({ userId: val }),
      };
      axios.post('https://jsonplaceholder.typicode.com/posts', payload)
      .then((res) => setData(res.data.id));
    }
  }, [fetchData]);

  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>

        <br></br>
        <input
          placeholder="Title of Post"
          value={val}
          onChange={(e) => setVal(1)}
        />
        <br></br>
        <button onClick={() => setFetch(true)}>Post API</button>
      </header>
    </div>
  );
}

export default App; 

実行した結果は下記の通りです。

最後に

axios.interceptor.response.use() と書くと、HTTP interceptorが作成され、HTTP リクエストごとにinterceptorがそれを感知して、もし 200 でない HTTP 応答があれば error 部分を実行し、単純な switch 文を使って特定のHTTPステータスに基づいたコードを実行できるようになります。