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

Next.js请求Apollo-Server-Express接口时Cookie未发送问题

排查解决步骤

1. 检查Cookie的属性配置

  • 确认Cookie的SameSite属性:如果Cookie设置了SameSite: Strict或Lax,即便主域名一致、端口不同的本地开发场景也会被拦截。本地开发可临时设置为SameSite: None,同时必须配套开启Secure: true(本地需要用HTTPS协议访问),生产环境根据实际跨站需求调整。
  • 如果你是跨二级域名访问(比如Next.js在app.example.com,Apollo Server在api.example.com),需要将Cookie的Domain属性设置为.example.com,才能在两个子站的请求中共享携带。
  • 确认Cookie的Path属性是/或者包含你请求的GraphQL接口路径,否则只会在匹配路径的请求中携带。
  • 注意HttpOnly属性不影响Cookie自动随请求发送,只会限制前端JS读取Cookie值,不需要为了传递Cookie关闭该属性。

2. 核对Apollo Server的CORS配置

即使没有CORS报错,也需要确认服务端配置支持凭证传递:

  • CORS配置不能使用通配符*作为origin值,通配场景下凭证配置会自动失效,必须显式指定Next.js的访问地址,同时开启credentials: true,参考配置:
const { ApolloServer } = require('@apollo/server');
const { expressMiddleware } = require('@apollo/server/express4');
const cors = require('cors');

app.use(cors({
  origin: ['http://localhost:3000'], // 替换为你的Next.js实际访问地址
  credentials: true
}));

app.use(
  '/graphql',
  expressMiddleware(server, {
    context: async ({ req, res }) => ({ req, res }) // 确保req对象被传入上下文
  })
);

3. 确认Next.js请求的执行环境

如果employeeSessionFetch是在Next.js服务端运行的逻辑中调用(服务端组件、getServerSideProps、服务端Action等),Node.js环境下的fetch不会自动携带浏览器端的Cookie,需要手动提取传递:

// 以getServerSideProps为例,手动提取请求头中的Cookie
export async function getServerSideProps(context) {
  const cookie = context.req.headers.cookie;
  const data = await employeeSessionFetch('你的GraphQL接口地址', cookie);
  // 其余业务逻辑
}

// 调整fetch函数兼容服务端场景
export const employeeSessionFetch = async (
  apiUrl: string,
  serverCookie?: string
) => {
  const headers = { 'Content-Type': 'application/json'};
  if (serverCookie) headers['Cookie'] = serverCookie;
  const data = await fetch(apiUrl, {
    method: 'POST',
    headers,
    credentials: 'include',
    cache: 'no-store', // Next.js 13+ App Router场景下避免缓存旧请求
    body: JSON.stringify({
      query: `query {
        employeeSession {
          id
          employee_id
        }
      }`,
    }),
  });
  return data;
};

4. 本地调试验证

打开浏览器开发者工具的「网络」面板,找到对应的GraphQL请求:

  • 如果请求头中没有Cookie字段:优先排查Cookie属性、CORS配置的问题
  • 如果请求头中有Cookie但服务端读取不到:检查是否有反向代理(如Nginx)转发时丢弃了Cookie头,或者Apollo Server的context没有正确传递req对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:36:03