2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Next.js(App Router)+Supabase】`cookies` was called outside a request scope.を解決する

Last updated at Posted at 2024-07-21

原因

公式ドキュメントにあるように動的APIがリクエストスコープの外で呼び出された際に発生します。

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.

このエラーが発生した理由
動的APIがリクエストスコープの外で呼び出された。 (例: グローバルスコープ)

動的APIは、すぐには見えない他のモジュール/関数(例: サードパーティライブラリ)の奥深くで呼び出された可能性があることに注意してください。

可能な修正方法
すべての動的API呼び出しがリクエストスコープ内で行われるようにしてください。

今回のエラーメッセージではcookiesがリクエストスコープの外で呼び出されたことが原因となります。

`cookies` was called outside a request scope. Read more: https://nextjs.org/docs/messages/next-dynamic-api-wrong-context

解決方法

私の使い方は以下のようにコンポーネント定義の外でsupbase変数を定義したのでエラーとなってしまいました(createClient関数の中でcookies()を使っています)

const supabase = createClient()

export default async function Page() {
  const { data } = await supabase.from('hoge').select();
}

  return (
    ...
  )

正しくはコンポーネント定義の中でcreateClient()を呼び出すように修正します。
これで、リクエストコープ内で呼び出すようになり、エラーが解消されます。

- const supabase = createClient()

export default async function Page() {
+ const supabase = createClient()
  const { data } = await supabase.from('hoge').select();
}

  return (
    ...
  )

深掘り

エラーが起きるということは、cookies()は動的APIなんだろうなという理解はしつつも、どこかに書いていないかなと思ったら cookies()は動的関数である、リクエスト時に動的レンダリングへのルートが選択される公式ドキュメントに記載がありました。
なので、cookies()は動的APIに当てはまるという理解をしました。

この辺りの理解が間違っていたらご指摘ください🙇

スクリーンショット 2024-07-21 12.59.44.png

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?