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

Next.js getServerSideProps加载不及时 如何保障Supabase服务端会话首屏正常加载

问题根因

你遇到的问题核心原因有两个:

  • 魔法链接跳转时携带的access_token、refresh_token等身份凭证存放在URL的哈希片段中,哈希片段不会被发送到服务端,首次跳转时客户端还未完成令牌解析和会话存储,所以getServerSideProps里调用getUserByCookie无法读取到有效用户信息
  • 你直接在组件顶层同步调用supabase.auth.user(),此时Supabase还未完成会话初始化(包括解析URL哈希中的令牌),所以首次加载拿到的是空值,无法触发跳转
修复方案

第一步:调整Supabase客户端配置

首先确保你的supaBaseClient配置开启了Cookie存储和URL会话检测,这样客户端解析完令牌后会自动同步到Cookie,后续服务端可以正常读取:

// utils/supabaseClient.js
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY

export const supabase = createClient(supabaseUrl, supabaseAnonKey, {
  auth: {
    // 开启会话自动存入Cookie
    storage: 'cookies',
    autoRefreshToken: true,
    persistSession: true,
    // 开启自动解析URL中的哈希令牌,默认开启,不要关闭
    detectSessionInUrl: true
  }
})

第二步:调整页面逻辑,监听会话初始化事件

改用Supabase提供的onAuthStateChange事件监听会话状态,该事件会在所有会话初始化操作(包括哈希令牌解析)完成后触发,配合加载态避免页面闪烁:

import router from "next/router";
import { useEffect, useState } from "react";
import { supabase } from "../utils/supabaseClient";

function Home() {
  const [loading, setLoading] = useState(true)

  useEffect(() => {
    // 监听认证状态变化,会话初始化完成后自动触发
    const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => {
      if (session?.user) {
        router.push('/admin')
      }
      setLoading(false)
    })

    // 组件卸载时注销监听器,避免内存泄漏
    return () => {
      authListener?.unsubscribe()
    }
  }, [])

  // 加载阶段显示占位内容,避免闪屏
  if (loading) {
    return <div className="min-h-screen bg-elkblue dark:bg-dark-pri flex items-center justify-center">加载中...</div>
  }

  return (
    <div className="min-h-screen bg-elkblue dark:bg-dark-pri">
      marketing
    </div>
  );
}

export async function getServerSideProps({ req }) {
  const { user } = await supabase.auth.api.getUserByCookie(req);
  if (user) {
    return {
      redirect: {
        destination: "/admin",
        permanent: false,
      },
    };
  }

  return {
    props: {  },
  };
}

export default Home;
方案说明
  • 原有服务端跳转逻辑不需要改动,针对已经存储了Cookie的用户(刷新场景),服务端会直接完成跳转,性能更好
  • 针对魔法链接跳转的首次加载场景,客户端会等待Supabase完成令牌解析后自动跳转,不会出现识别不到用户的问题
  • 加载态避免了用户先看到营销页再跳转的体验问题

内容的提问来源于stack exchange,提问作者Noah Wardlow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:36:04