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
相关产品推荐
相关产品推荐

