mirror of
https://github.com/hanzoai/next.js.git
synced 2026-09-24 17:00:51 +00:00
## Description Follow up #52038. Remove `https://nextjs.org` from URL in [error pages](https://github.com/vercel/next.js/tree/canary/errors). ### Improving Documentation - [x] Run `pnpm prettier-fix` to fix formatting issues before opening the PR. - [x] Read the Docs Contribution Guide to ensure your contribution follows the docs guidelines: https://nextjs.org/docs/community/contribution-guide --------- Co-authored-by: Delba de Oliveira <[email protected]>
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 `dynamicIO` 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/building-your-application/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)
|