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

Next.js API路由集成Supabase:为何Cookie在req.req.cookies中?

问题原因与解决方案

为什么Cookie在req.req.cookies而非req.cookies?

这是因为你使用的Yoga GraphQL在处理Next.js API路由时,会对原生的NextApiRequest进行包装。你当前拿到的req其实是Yoga自定义的请求对象,而原生的Next.js请求实例被嵌套在了req.req中,所以Cookie这类原生请求的属性只能从req.req里获取。

如何解决服务端Supabase客户端的问题?

是的,你需要将**原生的Next请求对象(req.req)和响应对象(res.res)**传入createServerSupabaseClient,因为这个方法期望接收标准的NextApiRequest和NextApiResponse实例,而非Yoga包装后的对象。

修改后的代码示例

const createContext = async (req: any, res: any) => {
  // 获取原生的Next请求与响应对象
  const nextReq = req.req;
  const nextRes = res.res;

  console.log('Req Cookies:', nextReq.cookies); // 现在能正确获取Cookie
  console.log('Cookies:', req.cookies); // Yoga自定义req的cookies为空是正常的

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

  return { supabase, user };
};

export default createYoga({
  schema,
  graphqlEndpoint: '/api/graphql',
  context: createContext,
});

类型修正建议

如果你需要严格的类型支持,可以通过Yoga提供的类型来标注context参数:

import type { YogaInitialContext } from 'graphql-yoga';
import type { NextApiRequest, NextApiResponse } from 'next';

const createContext = async ({ req, res }: YogaInitialContext) => {
  const nextReq = req.req as NextApiRequest;
  const nextRes = res.res as NextApiResponse;
  
  const supabase = createServerSupabaseClient<Database>({ req: nextReq, res: nextRes });
  const { data: { user } } = await supabase.auth.getUser();

  return { supabase, user };
};

这样修改后,createServerSupabaseClient就能正确读取到supabase-auth-token Cookie,服务端认证逻辑就能正常工作了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:17:01