BluePeriod Docs
開発トラブルシューティング

Next.js 15: params/searchParamsの非同期化によるエラー

Next.js 15でのparams非同期化に起因するエラーと解決策

Next.js 15: params/searchParamsの非同期化によるエラー

現象

Next.js 15へのアップデート後、動的ルート([id]など)を持つPageコンポーネントやAPIルートハンドラーにおいて、paramssearchParams のプロパティにアクセスしようとすると、値が undefined になったり、実行時エラーが発生したりする。 特に、APIルートでIDを取得できず、データベースクエリが404エラーになるケースが多い。

原因

Next.js 15から、params および searchParams プロパティは Promise (非同期) として提供されるように変更されました。 これにより、以前のように同期的にプロパティにアクセス(例: params.id)することができなくなりました。

参照: Next.js 15 Upgrade Guide - Async Request APIs

解決策

1. Pageコンポーネントの場合

paramsawait してから使用します。

// Before (Next.js 14)
export default function Page({ params }: { params: { id: string } }) {
  return <div>ID: {params.id}</div>;
}

// After (Next.js 15)
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
  const { id } = await params;
  return <div>ID: {id}</div>;
}

2. APIルートハンドラーの場合

同様に、第二引数の context オブジェクト内の paramsawait します。

// Before (Next.js 14)
export async function GET(
  request: NextRequest,
  { params }: { params: { id: string } }
) {
  const id = params.id;
  // ...
}

// After (Next.js 15)
export async function GET(
  request: NextRequest,
  props: { params: Promise<{ id: string }> }
) {
  const params = await props.params;
  const id = params.id;
  // ...
}

注意点

  • 型定義も Promise<...> に変更する必要があります。
  • useParams フック(クライアントコンポーネント)はこの変更の影響を受けませんが、サーバーコンポーネントからプロップスとして渡す場合は注意が必要です。
  • 開発中は警告が出る場合がありますが、本番ビルドではエラーになる可能性があるため、早急に対応することを推奨します。

On this page