使用Supabase和Next.js API路由-为什么cookie在req.req. cookie中?

atmip9wb  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(114)

我一直在尝试使用this Supabase guide进行Next.js的身份验证,尽管我可以使用客户端登录,但服务器客户端函数对我不起作用,特别是当我调用此函数时:

const supabase = createServerSupabaseClient<Database>({ req, res });

我得到错误TypeError: Cannot read properties of undefined (reading 'supabase-auth-token')。有趣的是,如果我console.log req.headersreq.cookies对我来说是空的,但如果我console.log req.req. cookie,我可以在那里看到supabase-auth-token。这是我如何尝试使用它:

const createContext = async (req: NextApiRequest, res: NextApiResponse) => {
  console.log('Req Cookies:', req.req.cookies); //cookies present
  console.log('Cookies:', req.cookies); //no cookies

  const supabase = createServerSupabaseClient<Database>({ req, res });
  console.log(supabase);
  const {
    data: { user },
  } = await supabase.auth.getUser();

  return { supabase, user };
};

export default createYoga<{
  req: NextApiRequest;
  res: NextApiResponse;
}>({
  schema,
  graphqlEndpoint: '/api/graphql',
  context: createContext,
});

为什么req没有cookie,而req.req有呢?如果是这样,req.req是createServerSupabaseClient需要的吗?我觉得我在这里遗漏了一些简单的东西。

mo49yndu

mo49yndu1#

这被证明是GraphQL Yoga的一个问题。事实证明,第一个参数中确实有req和resp,所以我应该将它们从第一个参数中删除,而不是尝试使用第一个和第二个参数。
下面是正确的代码:

type YogaRequest = {
  req: NextApiRequest;
  res: NextApiResponse;
};

const createContext = async ({ req, res }: YogaRequest) => {

  const supabase = createServerSupabaseClient<Database>({ req, res });
  const {
    data: { user },
  } = await supabase.auth.getUser();

  return { supabase, user };
};

相关问题