【发布时间】:2022-12-03 07:35:28
【问题描述】:
我正在为后端构建一个使用 Next.js 13 和 Supabase 的应用程序,并且我一直在寻找为当前登录用户创建上下文/提供程序的最佳/正确方法。
从 Supabase 检索用户的流程是这样的:
- 使用 OAuth 提供商登录。
- 从 supabase onAuthState Changed 挂钩的会话中获取用户 ID。
- 使用上述用户 ID 从 supabase 数据库中获取完整的用户对象。
我的布局中有一个 supabase 侦听器,用于侦听身份验证状态更改,并且可以很好地设置和刷新当前会话。 我最初的方法是从 onAuthState changed 挂钩中添加 fetchUser 调用,但是我遇到了延迟更新水合作用错误。
直接取自示例,这是应用程序的外观:
// layout.tsx export default async function RootLayout({ children, }: { children: React.ReactNode; }) { const supabase = createServerComponentSupabaseClient<Database>({ headers, cookies, }); const { data: { session }, } = await supabase.auth.getSession(); return ( <html> <head /> <body> <NavMenu session={session} /> <SupabaseListener accessToken={session?.access_token} /> {children} </body> </html> ); }// supabase-listener.tsx // taken directly from the supabase-auth-helpers library. "use client"; import { useRouter } from "next/navigation"; import { useEffect } from "react"; import supabase from "../lib/supabase/supabase-browser"; export default function SupabaseListener({ accessToken, }: { accessToken?: string; }) { const router = useRouter(); useEffect(() => { supabase.auth.onAuthStateChange(async (event, session) => { if (session?.access_token !== accessToken) { router.refresh(); } }); }, [accessToken, router]); return null; }我基本上只需要用 LoggedInUserProvider 包装我的根布局,在初始页面加载的某个地方调用获取用户,并设置当前登录用户提供程序的状态。
我尝试的其他方法是从根布局进行获取用户调用,并拥有一个将用户作为属性的 LoggedInUserListener 客户端组件,如果配置文件存在则简单地设置状态。这导致了不正确的设置状态错误。
太感谢了。
【问题讨论】:
标签: reactjs next.js react-context supabase next.js13