【JS応用|豆知識】fetch APIの落とし穴を回避!Response.prototype.okで通信エラーを正しく検知する

導入:なぜResponse.prototype.okが必要なのか

フロントエンド開発で避けて通れないのがAPI通信です。皆さんは、fetch APIを使っていて「404 Not Found」や「500 Internal Server Error」が発生しているのに、JavaScript側でエラー処理が走らずに成功扱いになってしまった経験はありませんか?実は、fetch APIはネットワークエラー(DNS不通など)が発生しない限り、HTTPステータスコードがエラーであっても「通信成功」とみなします。この問題をスマートに解決するのが、Response.prototype.okというプロパティです。

基礎知識:Responseオブジェクトとokプロパティ

fetch関数を実行すると、戻り値としてPromiseが返り、その解決値としてResponseオブジェクトが得られます。このオブジェクトには、HTTPレスポンスに関する情報が詰まっています。
Response.prototype.okは、レスポンスのステータスコードが200から299の範囲内(成功範囲)にある場合にtrue、それ以外の場合にfalseを返す読み取り専用のプロパティです。これを確認することで、サーバーからの応答が「業務的に成功しているか」を即座に判断できます。

実装:安全なデータ取得のパターン

fetchを利用する際は、必ずレスポンスを受け取った直後にokプロパティを確認する癖をつけましょう。もしokがfalseであれば、意図的にErrorをスローすることで、呼び出し元のcatchブロックで適切にエラーハンドリングを行うことができます。

サンプルプログラム:堅牢なAPIフェッチ処理

以下のコードは、okプロパティを利用してエラーを確実に捕捉する実用的な実装例です。

async function fetchData(url) {
  try {
    const response = await fetch(url);

    // 1. okプロパティでHTTPステータスを確認
    // falseの場合(404や500など)は例外を発生させる
    if (!response.ok) {
      throw new Error(`HTTPエラーが発生しました: ${response.status}`);
    }

    // 2. 正常な場合のみJSONとして解析する
    const data = await response.json();
    console.log('取得成功:', data);
    return data;

  } catch (error) {
    // 3. ネットワークエラーや上記でスローしたエラーをここで捕捉
    console.error('通信処理に失敗しました:', error.message);
  }
}

// 実行例
fetchData('https://api.example.com/data');

応用・注意点:現場で役立つポイント

1. 404以外も考慮する
認証エラー(401)や権限エラー(403)もokプロパティはfalseを返します。これらを区別したい場合は、エラーハンドリングの中でresponse.statusの値を確認すると、より詳細なユーザー案内が可能になります。

2. サーバー側のエラーレスポンス
APIによっては、エラー時にもJSON形式で詳細なメッセージを返してくることがあります。その場合、throwする前に await response.json() をしてエラーメッセージを取得すると、デバッグが非常に捗ります。

3. fetchの仕様を忘れない
繰り返しになりますが、DNSエラーやオフライン時はそもそもfetchが例外を投げてcatchブロックに飛びます。「通信自体ができたか」と「通信結果が成功か」の2段階でチェックするのが、フロントエンド開発におけるプロの作法です。

タイトルとURLをコピーしました