🔧
Next.js 16環境でparams.idが既存の書き方では使えない問題を解決した話
Next.js 16環境でparams.idが既存の書き方では使えない問題を解決した話
背景
簡易的なCMSを作るため microCMS を使って、Next.js App Router で一覧と詳細ページを構築しました。
一覧は /api/v1/‥‥ で正常に取得できるのに、詳細ページ /…/[id] にアクセスすると 404 が返る問題に遭遇しました。
Next.js App Routerでは、app/ ディレクトリ配下にファイルやフォルダを置くことでルートを定義します。
例えば以下のようにすると、一覧ページと詳細ページを作れます。
app/items/page.tsx // 一覧ページ
app/items/[id]/page.tsx // 詳細ページ(動的ルート)
一覧ページからリンクを貼るときは以下のようにします。
<Link href={`/items/${item.id}`}>詳細を見る</Link>
症状
- 一覧ページのリンクは正しく /items/${id} に設定済み
- しかし詳細ページで
params.idがundefinedになる - 結果、API呼び出しが .../items/undefined となり 404
原因
Next.js 15.1.6 以降では params が Promise として渡される仕様に変更されました。
そのため、直接 params.id にアクセスするとエラーや undefined になります。
この仕様は Next.js 16 でも継続しています。
修正前コード
export default async function ItemDetail({ params }: { params: { id: string } }) {
const id = params.id // ❌ undefinedになる
const data = await fetchData(id)
...
}
修正後コード
export default async function ItemDetail(
props: { params: Promise<{ id: string }> }
) {
const { id } = await props.params // ✅ awaitで解決
const data = await fetchData(id)
...
}
学び
- Next.js 15.1.6 以降では
paramsが Promise として返る - Next.js 16 環境でも同じ仕様が適用される
-
props.paramsをawaitしてから利用するのが安全 - microCMS 側の公開状態やエンドポイント設定も確認必須
Discussion
失礼します。 Route Props Helpers を使えば、冗長な型定義は不要になりますよ!
ありがとうございます!
非常に助かります!
Route Props Helpers を使うことで、確かに冗長な型定義を避けられるのですね。
とても参考になりました、教えていただき感謝します 🙏