mirror of
https://github.com/vercel/next.js.git
synced 2026-09-20 02:25:18 +08:00
22fc63da72
This PR cleans up small documentation and error-page issues: correct TypeScript spelling where it was written as “Typescript”, use the proper GitHub label in links, fix the MDN URL for `Map.prototype.values` in the middleware upgrade guide. No runtime or API behavior changes.
62 lines
2.7 KiB
Plaintext
62 lines
2.7 KiB
Plaintext
---
|
|
title: Cannot access Request information synchronously with Page or Layout or Route `params` or Page `searchParams`
|
|
---
|
|
|
|
## Why This Error Occurred
|
|
|
|
In Next.js 15 `params` passed into Page and Layout components and `searchParams` passed into Page components are now Promises.
|
|
|
|
To support migrating to the async `params` and `searchParams` Next.js 15 still supports accessing param and searchParam values directly on the Promise object. However when `cacheComponents` is enabled it is an error to do so.
|
|
|
|
## Possible Ways to Fix It
|
|
|
|
If you haven't already followed the Next.js 15 upgrade guide which includes running a codemod to auto-convert to the necessary async form of `params` and `searchParams` start there.
|
|
|
|
[Next 15 Upgrade Guide](/docs/app/guides/upgrading/version-15#async-request-apis-breaking-change)
|
|
|
|
If you have already run the codemod on your project look for instances of the string `@next-codemod-error` to see where the codemod was unable to convert to the async form. You will have to refactor your code manually here to make it compatible with the new result type.
|
|
|
|
Before:
|
|
|
|
```jsx filename=".../some-file.js"
|
|
// This component ends up being the Page component even though it is defined outside of
|
|
// page.js due to how it is reexported in page.js
|
|
export default function ComponentThatWillBeExportedAsPage({ params, searchParams }) {
|
|
const { slug } = params;
|
|
const { page } = searchParams
|
|
return <RenderList slug={slug} page={page}>
|
|
}
|
|
```
|
|
|
|
```jsx filename="app/page.js"
|
|
// the codemod cannot find the actual Page component so the Page may still have remaining
|
|
// synchronous access to params and searchParams
|
|
|
|
// @next-codemod-error
|
|
export * from '.../some-file'
|
|
```
|
|
|
|
After:
|
|
|
|
```jsx filename=".../some-file.js"
|
|
// This component ends up being the Page component even though it is defined outside of
|
|
// page.js due to how it is reexported in page.js
|
|
export default async function ComponentThatWillBeExportedAsPage({ params, searchParams }) {
|
|
const { slug } = await params;
|
|
const { page } = await searchParams
|
|
return <RenderList slug={slug} page={page}>
|
|
}
|
|
```
|
|
|
|
```jsx filename="app/page.js"
|
|
export * from '.../some-file'
|
|
```
|
|
|
|
It is unexpected that you would run the codemod and not successfully convert all instances of `params` and `searchParams` to async or have a marker string to help you locate unconverted cases. If you do find yourself in this situation please report this to [Next.js on GitHub](https://github.com/vercel/next.js/issues).
|
|
|
|
## Useful Links
|
|
|
|
- [`page.js` file convention](/docs/app/api-reference/file-conventions/page)
|
|
- [`layout.js` file convention](/docs/app/api-reference/file-conventions/layout)
|
|
- [`route.js` file convention](/docs/app/api-reference/file-conventions/route)
|