😎
【Next.js】Supabaseのフェッチでrevalidateを使う
はじめに
Supabaseはデフォルトでcross-fetchだったため、
revalidatePath
を使ってもうまく動きませんでした。
そこで、カスタムフェッチをして、revalidateできるようにしようと思います。
今回の元となるコード
server.ts
import { createServerClient, type CookieOptions } from '@supabase/ssr'
import { cookies } from 'next/headers'
export function createClient() {
const cookieStore = cookies()
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {...},
}
)
}
解決方法
createServerClient.global.fetch
に自作のfetchを書いて渡すことができます。
そこに、revalidate
を設定したfetchを用意してあげます。
今回渡すcustom fetch関数
server.ts
const customFetch = (...args: Parameters<typeof fetch>) => {
const [input, option] = args; //input = supabaseのURL
return fetch(input, {
...option,
next: {
revalidate: 3600,
},
});
作ったcustom fetch関数を渡してあげる
以下のように、global.fetch
に作ったものを渡してあげることで
revalidate: 3600
が設定された状態でSupabaseのデータをfetchすることができます。
server.ts
import { createServerClient, type CookieOptions } from '@supabase/ssr'
import { cookies } from 'next/headers'
export function createClient() {
const cookieStore = cookies()
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
global: {
fetch: customFetch
}
cookies: {...},
}
)
}
おわりに
デフォルトがcross-fetchということを知らずかなりの時間を割いてしまっていました。
参考になればうれしいです。
少し手を加えることでtags
を設定することもできると思うので試してみてください。
Discussion