0Pricing
Vue Academy · レッスン

エラーハンドリングとグローバルインターセプター

リクエストエラーを処理し、Axiosインターセプターを設定します。

「エラーハンドリングとグローバルインターセプター」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全3レッスンが含まれています。

リクエストは失敗することがある

ネットワークが切断されたり、サーバーがエラーを返したり、トークンが期限切れになったりします。堅牢なアプリは失敗を想定し、クラッシュしたりユーザーをスピナーの前にいつまでも置き去りにしたりせず、適切に対応します。

リクエストをtry/catchで囲む

awaitするリクエストをtry/catchで囲み、エラーを捕捉します。Axiosはサーバーが4xxまたは5xxのステータスを返すと例外をスローします。

async fetchPosts() {
  try {
    const res = await api.get("/posts")
    this.posts = res.data
  } catch (err) {
    console.error(err)
  }
}

エラーの確認

Axiosのエラーには役立つ詳細情報が含まれています。サーバーから応答があった場合はerror.responseが存在します。一方、これがない場合は通常、ネットワークエラーまたはタイムアウトによる失敗です。

catch (err) {
  if (err.response) {
    console.log(err.response.status)
    console.log(err.response.data)
  } else {
    console.log("Network error")
  }
}

エラー状態の追跡

エラーメッセージをリアクティブな状態に保存し、テンプレートからユーザーに表示できるようにします。

data() {
  return { posts: [], loading: false, error: null }
}

エラーの設定

リクエストのたびにエラーをリセットし、その後catchブロックでエラーを設定します。

async fetchPosts() {
  this.loading = true
  this.error = null
  try {
    this.posts = (await api.get("/posts")).data
  } catch (err) {
    this.error = "Could not load posts. Please try again."
  } finally {
    this.loading = false
  }
}

エラーメッセージの表示

テンプレートにエラーを表示し、何が起きたのか、次に何をすべきかをユーザーが理解できるようにします。

<template>
  <p v-if="loading">Loading...</p>
  <p v-else-if="error" class="error">{{ error }}</p>
  <ul v-else>
    <li v-for="p in posts" :key="p.id">{{ p.title }}</li>
  </ul>
</template>

インターセプターとは

Axiosのインターセプターを使うと、すべてのリクエストやレスポンスに対して自動的にコードを実行できます。トークンの付加やエラー処理を一か所にまとめるなど、横断的な関心事に最適です。

リクエストインターセプター

リクエストインターセプターは、各リクエストが送信される前に実行されます。認証ヘッダーをグローバルに付加するために使います。

api.interceptors.request.use(config => {
  const token = localStorage.getItem("token")
  if (token) {
    config.headers.Authorization = "Bearer " + token
  }
  return config
})

レスポンスインターセプター

レスポンスインターセプターは、各レスポンスの到着後に実行されます。成功時用とエラー時用の2つのコールバックを受け取ります。

api.interceptors.response.use(
  response => response,
  error => {
    if (error.response && error.response.status === 401) {
      // redirect to login
    }
    return Promise.reject(error)
  }
)

グローバルエラー処理

レスポンスインターセプターにエラー処理を集約すると、個々のコンポーネントをすっきり保てます。401の場合のログアウトや、500の場合のトースト表示といった一般的な処理を一か所にまとめられます。

api.interceptors.response.use(
  res => res,
  error => {
    const status = error.response ? error.response.status : null
    if (status === 401) logout()
    if (status >= 500) showToast("Server error, try later")
    return Promise.reject(error)
  }
)

簡単な再試行ロジック

不安定なネットワークでは、あきらめる前に失敗したリクエストを限られた回数だけ再試行できます。

async function getWithRetry(url, retries = 2) {
  try {
    return await api.get(url)
  } catch (err) {
    if (retries > 0) {
      return getWithRetry(url, retries - 1)
    }
    throw err
  }
}

理解度チェック

エラー処理とインターセプターについての理解度を確認しましょう。

まとめ

リクエストをtry/catchで囲み、UIにわかりやすいerrorメッセージを表示し、error.responseを確認してサーバーエラーとネットワークエラーを区別します。インターセプターを使うと関心事を集約できます。リクエストインターセプターでトークンを付加し、レスポンスインターセプターでグローバルエラーを処理し、小さな再試行ヘルパーで堅牢性を高めます。次はアプリのパフォーマンスを最適化します。

よくある質問

「エラーハンドリングとグローバルインターセプター」レッスンは無料ですか?

はい。「エラーハンドリングとグローバルインターセプター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全3レッスンが含まれています。

「エラーハンドリングとグローバルインターセプター」で何を学びますか?

リクエストエラーを処理し、Axiosインターセプターを設定します。 ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Vue Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「エラーハンドリングとグローバルインターセプター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このVue Academyレッスンでコードを書いて実行できますか?

はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. AxiosによるHTTPリクエスト
  2. ライフサイクルフックとデータ取得
  3. エラーハンドリングとグローバルインターセプター
← Vue Academyに戻る