コース一覧
Next.jsフルスタック:サーバー・データ取得・API
notFoundで404にする

Next.jsフルスタック:サーバー・データ取得・API

Server ComponentsとClient Components、use client、サーバーfetch、asyncコンポーネント、動的ルート、params、notFound、キャッシュ、Route Handler、GET・POST API、Server Actions、フォームを扱う全24レッスンのフルスタックコースです。fleamaの商品取得と出品機能をNext.js内へ実装します。

1
Server / Client Components
01. サーバーで動く部品10分
02. Server Components15分
03. use clientの宣言15分
04. どちらに置くか15分
05. 境界をまたぐ合成15分
06. 境界の設計15分
07. つくる - 部品の仕分け20分
08. 第4章クイズ15分
2
データ取得と動的ルート
01. サーバーでfetch15分
02. asyncコンポーネント15分
03. 動的ルート15分
04. paramsを受け取る15分
05. notFoundで404にする15分
06. キャッシュのきほん10分
07. 検索をサーバーで15分
08. つくる - サーバー取得化20分
09. 第5章クイズ15分
3
API Routesとフォーム
01. Route Handler15分
02. GET APIを作る15分
03. POST APIを作る15分
04. Server Actionsの触り15分
05. フォーム実装15分
06. つくる - 受け口の完成20分
07. 第6章クイズ15分

notFoundで404にする

notFound で404にする

無い商品を開かれたとき

/items/999 のように、存在しない id で開かれることは必ず起こります。売り切れて取り下げた商品の URL が、誰かのブックマークに残っているからです。

いまの詳細ページは、取得に失敗しても何も判定していません。商品名の場所が空欄になったページが出るだけです。これは見た目が壊れているだけでなく、検索エンジンに「中身のあるページ」として登録されてしまいます。

notFound を呼ぶ

Next.js には、その場で表示をやめて404扱いに切り替える関数があります。

TypeScript (JSX)

import { notFound } from "next/navigation"; const res = await fetch(`/api/items/${id}`); if (!res.ok) { notFound(); }

notFound() は値を返しません。呼んだ時点でそのページの描画が打ち切られます。だから return を付ける必要はありませんし、そのあとの行が動くこともありません。

出す画面を決める

打ち切ったあとに何を出すかは app/not-found.tsx に書きます。page.tsx や layout.tsx と同じく、名前が決まっているファイルです。

置いた階層から下のページ全部に効きます。app/not-found.tsx に1つ置けば、サイト全体の404画面になります。商品の一覧に戻るリンクを添えておくと、行き止まりになりません。

演習

存在しない id のときに notFound() を呼び、404の画面を出します。

ヒント

notFound() は呼んだ時点で描画を打ち切るので、return は要りません

res.ok は 200 番台のときだけ真になります

app/not-found.tsx は次の行から書き始めて構いません。中身は普通の部品です

app/items/[id]/page.tsx
layout.tsx
not-found.tsx
app/page.tsx
mock-api.json
プレビュー

できているか

  • ある商品はいままでどおり出る
  • 無い商品では404の画面が出る
  • 取得に失敗したら notFound を呼んでいる
  • app/not-found.tsx で画面を export default している
エディタを読み込んでいます