Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsIf you see “params should be awaited” in a Next.js App Router project, find where code reads the Promise-based params value before unwrapping it. In server code, use await params; in a synchronous Client Component, use React’s use(params). Next.js 15 temporarily allowed some synchronous reads for migration compatibility, but Next.js 16 removed that compatibility.
What the error means
Next.js changed request-time APIs that depend on incoming request information from synchronous values to Promises. The change covers params passed to pages and layouts, as well as page searchParams and related APIs. Reading a field directly, such as params.slug, or enumerating, spreading, or iterating the object before unwrapping it can trigger the warning or error. The official documentation describes the change as making these APIs asynchronous in Next.js 15: Dynamic APIs are Asynchronous.
As an Amazon Associate I earn from qualifying purchases.
The precise behavior depends on version and configuration. In Next.js 15, synchronous access was deprecated but temporarily supported for migration; with cacheComponents enabled, it is an error. In Next.js 16, synchronous access is no longer supported. The related prerender error reference explains the Cache Components case: Synchronous access to params.
Free tools Windows power users keep installed
One-click scans. No signup required.
Fix it in server code with await
For a Server Component page or layout, make the component function asynchronous, await params, and only then use its fields. Update the prop type to a Promise as well:
#1 Best Overall
export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params
return <h1>{slug}</h1>
}
Apply the same rule in a Route Handler: its context supplies params as a Promise, so await it before reading route values. The official references show the expected shapes for Route Handlers and Dynamic Routes.
Fix it in a synchronous Client Component with use
A Client Component cannot itself be an async component. If it must remain synchronous, import React’s use and unwrap the Promise before accessing a field:
Rank #2
'use client'
import { use } from 'react'
export default function Page({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = use(params)
return <h1>{slug}</h1>
}
Choose based on the component boundary: use await in server code and use in a synchronous Client Component. The Next.js error reference documents both approaches: Dynamic APIs are Asynchronous.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Find every synchronous access
The first stack frame may not identify every affected call site. Search the App Router project for direct property reads and operations that inspect the object before it is unwrapped. Also follow helper calls and re-exports: the route file may export a component defined elsewhere.
Rank #3
- Direct reads such as
params.idorparams.slug. - Destructuring before awaiting, such as
const { id } = params. - Object spread,
Object.keys(params), or iteration overparams. - Helpers that receive
paramsand immediately inspect it. - Components re-exported from another module, where the actual page or layout definition resides.
Then check each route entry point and related API; changing one page does not migrate the rest of the application.
Audit the other affected route APIs
The async change is not limited to a page’s body. Check layouts, Route Handlers, default files, and code that produces metadata or viewport information. Page searchParams is asynchronous too. Special image and icon route APIs are also included in the upgrade guidance.
- Metadata: update
generateMetadataand any code that reads request-dependent route values. - Viewport: check
generateViewportfor synchronous access. - Special routes: inspect image and icon-related route files covered by the migration guide.
- Page queries: await
searchParamsin server code or unwrap it withusewhere a synchronous Client Component consumes it.
See the official Next.js 15 upgrade guide for migration scope and examples.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Update route prop types
Change old plain-object annotations to Promise-based types. For example, a page receiving a slug should declare params: Promise<{ slug: string }>. Next.js also provides generated route helpers, including PageProps, LayoutProps, and RouteContext, for route-specific typing. Type generation runs during next dev and next build, or can be invoked with next typegen. The Page reference describes the generated page props.
Use the codemod, then review its changes
The official codemod can migrate many dynamic API usages, but it cannot safely infer every component’s role or rewrite every case. Run it from the project root:
npx @next/codemod@latest next-async-request-api .
- Review the resulting diff and confirm that each migrated route has the correct server or client pattern and Promise-based type.
- Search the project for
@next-codemod-errorand resolve each remaining manual-migration case. - Only change a comment prefix to
@next-codemod-ignorewhen the flagged case genuinely needs no action. - Run the project’s normal development or build checks to catch unresolved migration comments and type errors.
The codemod and remaining-comment behavior are documented in the Next.js codemods guide.
Consider when you unwrap request data
Awaiting a request-time value only where it is needed can leave more of a page eligible for static rendering. By contrast, using page searchParams reads request-time data and opts the page into dynamic rendering; with Cache Components, where that value is accessed affects how much can be prerendered. Avoid unwrapping earlier than necessary when the value is only needed by part of a page. See the Page reference for the rendering implications of searchParams.
Check your version before interpreting the message
| Next.js version or setting | What to expect | What to do |
|---|---|---|
| Next.js 14 and earlier | params was synchronous. |
When upgrading, adopt the Promise-based API shape. |
| Next.js 15 | Synchronous access was temporarily supported for migration but deprecated; with cacheComponents enabled, it is an error. |
Use await or React use rather than relying on compatibility behavior. |
| Next.js 16 | Synchronous access to request-time APIs such as params and page searchParams has been removed. |
Use the async API and update route typing. |
The migration behavior is covered by the Next.js 15 upgrade guide and Next.js 16 upgrade guide.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




