Supabase V2中如何用withPageAuth实现redux-next-wrapper原SSR功能?
问题描述
在Supabase V2版本之前,我通过以下代码借助redux-next-wrapper获取数据并存入Redux:
export const getServerSideProps = wrapper.getServerSideProps( (store) => async ({ req }) => { const { user } = await supabase.auth.api.getUserByCookie(req); if (user === null) { return { redirect: { permanent: false, destination: "/auth", }, props: {}, }; } if (user) { async function getData() { let { data, error, status } = await supabase .from("table") .select(`id`) .eq("id", user.id); store.dispatch(writeUserData(data)); return data; } return { props: { data: await getData(), }, }; } } );
但Supabase V2破坏了redux-next-wrapper的部分功能,请问如何使用withPageAuth实现上述相同功能?以下是withPageAuth的基础示例:
export const getServerSideProps = withPageAuth({ redirectTo: '/foo', async getServerSideProps (ctx, supabase) { // Access the user object const { data: { user } } = await supabase.auth.getUser() return { props: { id: user?.id } } } })
解决方案
要在Supabase V2中用withPageAuth实现原逻辑,需将redux-next-wrapper的wrapper与withPageAuth结合,在认证回调内完成数据查询和Redux存储,具体代码如下:
export const getServerSideProps = wrapper.getServerSideProps( (store) => async (ctx) => { // 用withPageAuth处理认证跳转,内部执行原有业务逻辑 const authResult = await withPageAuth({ redirectTo: "/auth", async getServerSideProps(_, supabase) { // 获取当前认证用户 const { data: { user } } = await supabase.auth.getUser(); if (!user) { return { props: {} }; } // 查询用户对应数据 const { data, error, status } = await supabase .from("table") .select(`id`) .eq("id", user.id); // 将数据存入Redux store.dispatch(writeUserData(data)); return { props: { data } }; } })(ctx); return authResult; } );
关键说明:
- 保留redux-next-wrapper的外层
wrapper.getServerSideProps结构,内部嵌套withPageAuth处理认证逻辑 - 通过
withPageAuth回调传入的supabase实例获取用户,替代V1版本的getUserByCookie方法 - 数据查询和Redux dispatch逻辑与原代码一致,直接放在
withPageAuth的回调内 redirectTo参数指定未认证用户的跳转目标,withPageAuth会自动处理未认证场景的跳转,无需手动判断用户是否为空
内容的提问来源于stack exchange,提问作者Brydawg
相关产品推荐
相关产品推荐

