LESSON 14 · 約20分
読み込み・0件・404・失敗に備える
うまくいかなかったときにも、次の一歩が分かる画面にします。
コードを試す前に
基本演習はApp Router・JavaScript/JSX・Cache Components無効で進めます。11の有効化例は独立した発展実験です。01〜04は先に読んで、コードの実行は05の環境構築後に戻って試せます。
短い学習用の例です。各例は段階ごとの独立した例であり、全コードを一つのプロジェクトへ順に上書きして完成する形式ではありません。必要なファイル・依存関係・前提条件は注記に記載しています。
開発環境の準備を確認する →このレッスンでわかること
- 正常な0件と異常を分けられる
- notFoundとerrorファイルの使い道が分かる
失敗の種類を分ける
検索が0件は正常。存在しない記事は404。入力ミスはフォームの検証結果。接続障害などの予期しない例外はエラーUIへ。全部を同じ「エラーです」で済ませず、利用者が次に何をすればよいかを伝えます。
規約ファイルで表示の境界を作る
loading.jsxは待機表示、not-found.jsxはnotFound()が呼ばれたときの表示、error.jsxは範囲内の予期しない例外へのフォールバックです。error.jsxはClient Componentです。同じ階層のlayout自身の例外まで必ず受け止めるわけではありません。
内部の詳細を、そのまま公開しない
DBの接続文字列や個人情報を画面のエラー文へ出さないようにします。利用者向けの説明と、開発者が原因を追える記録を分けましょう。イベントハンドラーのエラーがすべてerror.jsxに届くわけでもありません。
予期しない失敗の表示
app/notes/error.jsx
'use client'
import Link from 'next/link'
export default function NotesError() {
return (
<section role="alert">
<h2>ノートを表示できませんでした</h2>
<p>時間をおいてもう一度お試しください。</p>
<Link href="/">ホームへ戻る</Link>
</section>
)
}エラー回復用propsのAPIは利用中の版で確認してください。現行公式では再取得を伴うretryと、状態を解除するresetを区別しています。
存在しないページの案内
app/not-found.jsx
import Link from 'next/link'
export default function NotFound() {
return (
<main>
<h1>ページが見つかりません</h1>
<Link href="/notes">ノート一覧を見る</Link>
</main>
)
}TRY IT YOURSELF
失敗シナリオを点検する
- レッスン07の固定データ版へ戻し、取得処理またはpage内で意図的に例外を投げる
- 例外を取り除いた上で/notes/unknownを開き、not-found表示を確認する
- /notes/reactで正常表示も再確認する
できたらOK:失敗画面から利用者が別のページへ移動できる
QUICK CHECK
理解を確かめよう
公式資料でもう少し詳しく
ここまで読めたら、ひとつ前進。