-
Notifications
You must be signed in to change notification settings - Fork 27.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: clarify Dynamic API calls in wrong context (#62143)
### What? An unactionable error is thrown when `headers()`, `cookies()` or other Dynamic API functions are called outside the render/request context. This PR clarifies what the user can do to fix the problem. ### Why? The current error is hard to understand > Error: Invariant: `cookies` expects to have requestAsyncStorage, none available. ### How? I am adding a dedicated error page and rephrasing the error message. Closes NEXT-2509
- Loading branch information
1 parent
031cf70
commit 971843d
Showing
6 changed files
with
58 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
--- | ||
title: Dynamic API was called outside request | ||
--- | ||
|
||
#### Why This Error Occurred | ||
|
||
A Dynamic API was called outside a request scope. (Eg.: Global scope). | ||
|
||
Note that Dynamic APIs could have been called deep inside other modules/functions (eg.: third-party libraries) that are not immediately visible. | ||
|
||
#### Possible Ways to Fix It | ||
|
||
Make sure that all Dynamic API calls happen in a request scope. | ||
|
||
Example: | ||
|
||
```diff | ||
// app/page.ts | ||
import { cookies } from 'next/headers' | ||
|
||
- const cookieStore = cookies() | ||
export default function Page() { | ||
+ const cookieStore = cookies() | ||
return ... | ||
} | ||
``` | ||
|
||
```diff | ||
// app/foo/route.ts | ||
import { headers } from 'next/headers' | ||
|
||
- const headersList = headers() | ||
export async function GET() { | ||
+ const headersList = headers() | ||
return ... | ||
} | ||
``` | ||
|
||
### Useful Links | ||
|
||
- [`headers()` function](https://nextjs.org/docs/app/api-reference/functions/headers) | ||
- [`cookies()` function](https://nextjs.org/docs/app/api-reference/functions/cookies) | ||
- [`draftMode()` function](https://nextjs.org/docs/app/api-reference/functions/draft-mode) | ||
- [`unstable_noStore()` function](https://nextjs.org/docs/app/api-reference/functions/unstable_noStore) | ||
- [`unstable_cache()` function](https://nextjs.org/docs/app/api-reference/functions/unstable_cache) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters