next.js 如何在tRPC上下文上获取supbase auth用户数据?

wfveoks0  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(168)

我正在使用t3堆栈创建一个应用程序:下一个,prisma,tRPC。我正在沿着一个使用Clerk进行认证的tutorial,而我正在使用Supabase Auth。在我定义tRPC过程的文件中(即设置createTRPCContext)我需要访问tRPC上下文中的会话数据,然后可以将其传递到tRPC路由器中。本教程的作者使用Clerk的getAuth实现了这一点,但目前还不清楚如何使用subase实现这一点。
文档建议使用await supabase.auth.getSession();获取会话数据。但是为了创建supabase的示例,我想我可以使用提供的钩子或createServerSupabaseClient方法。Hooks不会工作,因为它不是React组件/hook; createServerSupabaseClient不能工作,因为我需要向它传递一些东西。我应该示例化另一个supabase示例,这似乎也很奇怪。
在tRPC过程中获取用户会话数据的正确方法是什么?

ar7v8xwq

ar7v8xwq1#

您需要上下文www.example.com。https://trpc.io/docs/context#inner-and-outer-context.
在trpc中,您有内部上下文和外部上下文,因此您可以获得nextjs api上下文

// server/trpc.ts

// inner context
interface CreateInnerContextOptions extends Partial<CreateNextContextOptions> {
supabase: SupabaseClient | null;
}

// outer context
export async function createContextInner(opts?: CreateInnerContextOptions) {
    return {
        supabase: opts?.supabase as SupabaseClient<Database> ?? null,
    };
}

export async function createContext(opts: CreateNextContextOptions) {
    const supabase = createPagesServerClient<Database>(opts);
    const contextInner = await createContextInner({ supabase });
    return {
        ...contextInner,
        req: opts.req,
        res: opts.res,
    };
}
export type Context = inferAsyncReturnType<typeof createContextInner>;

//standard trpc declaration and passing context type 
const t = initTRPC.context<Context>().create()

并传递createContext

// [trpc].ts
export default trpcNext.createNextApiHandler({
    router: appRouter,
    createContext
});

然后你可以像这样使用上下文

// [trpc].ts
publicProcedure.input( ...).mutation(async({input, ctx}) => {
const supabase = ctx.supabase
...rest of the code

相关问题