IT-Q

動的ルートで params.slug を読もうとしたら、期待した値が入っていませんでした。何を疑いますか。

params が Promise になっていることを疑います。現在の App Router では params と searchParams が Promise で、await してから分解する必要があります。

面接官が見ているのは🔴 Next.js 15 の破壊的変更。古いコードを写すと必ず踏む。

よくある答えと、面談でどう見られるか

  • params が Promise になっているので await が要る
    15 で Promise になり、16 で同期的な読み方が使えなくなりました。古いサンプルや生成AIの出力には旧形式が多く残っています。
  • フォルダ名の角括弧の書き方を間違えている
    その可能性もありますが、その場合はルート自体が一致せず 404 になります。「値が入っていない」なら Promise の方を先に疑います。
  • Client Component では params を受け取れない
    受け取れます。Client Component は async にできないので、React の use() で Promise を読みます。設問の症状は、Promise を await していないケースが圧倒的に多いです。
  • generateStaticParams を書いていないから
    書かなくても動的に生成されます。値が入らない理由にはなりません。

面接官は何を見ているか

  • params が Promise になったことを疑えた
  • await が必要だと言えた
  • バージョンによる違いだと理解している

模範解答

params が Promise になっていることを疑います。

現在の App Router では、params と searchParams は Promise です。型としても params: Promise<{ slug: string }> と書き、使うときは const { slug } = await params のように await します。

変更は2段階です。14 までは同期的なオブジェクトでした。15 で Promise になりましたが、互換のため同期的に読んでも動いていました。16 でその互換が無くなり、直接読むと値が取れなくなりました。「15 で動いていたコードが 16 に上げたら壊れた」の典型です。ネット上のサンプルや生成AIが出すコードには、直接読む古い形が今も多く残っています。

なお、これに伴い page や layout を async にする必要が出てきます。

対象: Next.js 16(App Router) 照合した一次資料: 公式ドキュメント 照合: 2026-10-25 最終更新: 2026-10-25
お使いの版で挙動が違う場合があります。誤りに気づいたらこの解説を報告するから教えてください。

ここからどう深掘りされるか

この問いに答えられた場合、面談は次の質問に進みます。

一部しか触れられなかった場合
動的ルートは、どう作りますか。
触れられなかった場合
動的ルートは、どう作りますか。