You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js 15集成Supabase出现GET请求加载失败问题求助

Next.js 15 + Supabase:动态路由控制台出现Fetch失败错误但页面正常加载

问题描述

我在Next.js 15应用中使用Supabase处理认证与数据库交互,访问部分动态路由(如/docs/[url_slug])及部分包含Supabase查询的非动态路由时,控制台会抛出类似Fetch failed loading: GET "http://localhost:3000/docs/astro?_rsc=1h5ff"的错误,但页面内容仍能正常加载。

动态路由页面(/docs/[url_slug]/page.tsx)代码如下:

import DocDetails from "@/components/docs-pages/doc-details";
import DocHeader from "@/components/docs-pages/doc-header";
import { createClient } from "@/utils/supabase/server";

export const dynamic = "force-dynamic";

export default async function LinkPage({ params }: { params: Promise<{ url_slug: string }> }) {
    try {
        const { url_slug } = await params;

        const supabase = createClient();
        const { data: link, error } = await (await supabase)
            .from("links")
            .select("*, categories(name)")
            .eq("url_slug", url_slug)
            .maybeSingle();

        if (error || !link) {
            console.error("Error fetching link data:", error);
            return <div>Error fetching data. Link not found.</div>;
        }

        return (
            <section>
                <DocHeader category={link.categories.name} name={link.name} />
                <DocDetails url={link.url} description={link.description} created_at={link.created_at} />
            </section>
        );
    } catch (error) {
        console.error("Error resolving params:", error);
        return <div>Error fetching data.</div>;
    }
}

我已尝试将数据库查询迁移至API路由、封装为外部函数,但问题依旧存在,求可行解决方案。

解决方案

1. 修正Supabase客户端初始化与调用逻辑

首先检查@/utils/supabase/server中的客户端创建代码,确保是Next.js App Router标准的服务器端实现:

import { createServerClient, type CookieOptions } from '@supabase/ssr'
import { cookies } from 'next/headers'

export const createClient = () => {
  const cookieStore = cookies()

  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
    {
      cookies: {
        get(name: string) {
          return cookieStore.get(name)?.value
        },
        set(name: string, value: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value, ...options })
          } catch (error) {
            // 忽略服务器组件中设置cookie的错误
          }
        },
        remove(name: string, options: CookieOptions) {
          try {
            cookieStore.set({ name, value: '', ...options })
          } catch (error) {
            // 忽略服务器组件中移除cookie的错误
          }
        },
      },
    }
  )
}

关键修正:你的页面代码中对supabase实例使用了多余的await,标准客户端创建返回的是同步对象,无需await。修改查询代码:

// 原错误代码
const { data: link, error } = await (await supabase)
    .from("links")
    .select("*, categories(name)")
    .eq("url_slug", url_slug)
    .maybeSingle();

// 修改后
const { data: link, error } = await supabase
    .from("links")
    .select("*, categories(name)")
    .eq("url_slug", url_slug)
    .maybeSingle();

2. 修正动态路由参数类型

Next.js 15 App Router中,动态路由参数无需用Promise类型包装,直接解析为普通对象:

// 原类型定义
export default async function LinkPage({ params }: { params: Promise<{ url_slug: string }> }) {
    try {
        const { url_slug } = await params;

// 修改后
export default async function LinkPage({ params }: { params: { url_slug: string } }) {
    try {
        const { url_slug } = params;

3. 排查RSC请求错误细节

打开浏览器DevTools的Network面板,查看带_rsc参数的请求具体错误信息:

  • 检查响应状态码(如404、500)
  • 查看响应内容中的具体错误提示
  • 确认页面中是否存在客户端组件重复发起服务器端已完成的查询,导致请求冲突

4. 检查Supabase RLS权限

登录Supabase控制台,确认links表的Row Level Security(RLS)规则是否允许服务器端查询获取数据。即使页面能加载,隐性的权限问题可能导致RSC请求的部分内容异常,触发控制台错误。

内容的提问来源于stack exchange,提问作者Jayden Priestley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:34:57