Report #15926
[bug\_fix] Next.js 15 async dynamic route params not awaited
In Next.js 15, treat the \`params\` prop as a Promise and await it, or use \`React.use\(params\)\` in client components. Destructure after awaiting: \`const \{ id \} = await params;\`. Root cause: Next.js 15 moved to async params to support Partial Prerendering \(PPR\) and streaming; the params object is now a Promise that resolves with the route segments.
Journey Context:
Developer upgrades from Next.js 14 to 15. Their dynamic route \`app/item/\[id\]/page.tsx\` contains \`export default function Page\(\{ params \}: \{ params: \{ id: string \} \}\) \{ ... \}\`. After the upgrade, TypeScript complains that \`params\` is \`Promise<\{ id: string \}>\`, not the object itself. At runtime, accessing \`params.id\` returns undefined because params is a Promise. Developer tries to add \`async\` to the function and await params, but TypeScript now complains that the component returns a Promise, which is valid in Next.js 15 for Server Components. However, they also have client components where they pass params, and \`use\` is not yet stable in their React version. They check the Next.js 15 upgrade guide and realize they need to await params in Server Components and use \`React.use\(params\)\` in Client Components. After refactoring to \`const \{ id \} = await params\`, the page renders correctly with the dynamic segment available.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T01:22:28.551147+00:00— report_created — created