12.3 Fetch APIによるデータ取得の実装

それでは、fetchBookData 関数の中身を書き換えて、実際に外部からデータを取得してみましょう。fetchBookData 関数を以下のように更新します。

ソースフォルダ:public/ch12

ファイル名:book-search.js

async function fetchBookData() {
	try {
		// 1. fetchを使って外部サーバーへデータのリクエストを送信します
		const response = await fetch("https://jsonplaceholder.typicode.com/posts");
		
		// 2. 通信が成功したか(ステータスコードが200系か)をチェックします
		if (!response.ok) {
			throw new Error(`HTTPエラーが発生しました。ステータス: ${response.status}`);
		}
		
		// 3. 届いたデータをJavaScriptで扱えるオブジェクト形式(JSON)に変換します
		const books = await response.json();
		
		// 通信が成功したことを確認するためのメッセージ
		console.log(`通信成功!${books.length}件のデータを取得しました。`);
		
		return books;
	} catch (error) {
         // 通信に失敗した場合のエラーメッセージ
		console.log(`データの取得に失敗しました: ${error.message}`);
		return [];
	}
}

実行結果

解説

fetchBookData 関数の役割と設計

この関数は「データ取得専用」の関数として独立させています。なぜ独立させるのでしょうか?

【理由 1】単一責任の原則

この関数は「外部 API からデータを取得する」という 1 つの役割だけを持ちます。
表示処理や加工処理は別の関数に任せることで、それぞれの責任が明確になります。

【理由 2】再利用性の向上

データ取得処理を独立させることで、他の場面でも同じ関数を使い回せます。
例えば、「更新ボタン」を追加する場合も、この関数を呼び出すだけです。

【理由 3】テストのしやすさ

データ取得だけを単独でテストできるため、問題の切り分けが容易になります。

try-catch ブロックの復習と実践

4 行目から 20 行目の try-catch ブロックを見てみましょう。

【try ブロック】

正常にデータが取得できた場合の処理を記述します。
4 行目: fetch()でリクエストを送信

4: const response = await fetch("https://jsonplaceholder.typicode.com/posts");

7-9 行目: レスポンスの成功判定

7: if (!response.ok) {
8:     throw new Error(`HTTP エラーが発生しました。ステータス: ${response.status}`);
9: }

12 行目: JSON への変換

12: const books = await response.json();

17 行目: 取得したデータを返す

17: return books;
【catch ブロック】

エラーが発生した場合の処理を記述します。
20 行目: エラーメッセージを console.log で出力
21 行目: 空配列[]を返す

21: console.log(`データの取得に失敗しました: ${error.message}`);
22: return [];
なぜ空配列を返すのか?

この関数の戻り値を受け取る側(後で作成するコード)が、「配列」を期待しているためです。
エラー時も undefined ではなく空の配列を返すことで、後続の処理でエラーが発生するのを防ぎます。

await の動作詳細

4 行目と 12 行目で await を使っています。

4: const response = await fetch("https://jsonplaceholder.typicode.com/posts");

→ サーバーからの「返事」が届くまで待ちます

12: const books = await response.json();

→ 受け取ったデータを JavaScript で使える形式に変換し終わるまで待ちます

この「待つ」処理があることで、データが確実に取得できてから次の処理に進むことができます。

response.ok のチェック

7 行目の if (!response.ok)は重要なチェックポイントです。fetch()は、サーバーから何らかの返事が返ってくれば「成功」と判定します。 しかし、その返事が「404 Not Found」や「500 Internal Server Error」といったエラーの場合もあります。

response.ok プロパティは、HTTP ステータスコードが 200 番台 (成功を表す)かどうかを判定します。

【よくある HTTP ステータスコード】
  • 200 OK: 成功
  • 404 Not Found: ページが見つからない
  • 500 Internal Server Error: サーバー内部エラー

response.ok が false の場合、8 行目でエラーを投げ(throw)、catch ブロックに処理が移ります。

7:       if (!response.ok) {
8:           throw new Error(`HTTP エラーが発生しました。ステータス: ${response.status}`);
9:       }
18: } catch (error) {
19:     // 通信に失敗した場合のエラーメッセージ
20:     console.log(`データの取得に失敗しました: ${error.message}`);
21:     return [];
22: }