Next.js API代理无法正确转发更新后的Cookie问题求助
问题描述
我正在使用Next.js API路由作为代理调用CopilotKit runtime URL,尝试通过自定义fetch将传入请求的Cookie和请求头转发至CopilotKit runtime。但代理始终使用应用启动时接收的首个Cookie,无法获取传入请求中的更新Cookie(已确认请求中存在更新后的Cookie)。我已尝试提取Cookie并将访问令牌作为自定义请求头传递,但问题仍未解决。
相关代码
import { copilotKitEndpoint, CopilotRuntime, copilotRuntimeNextJSPagesRouterEndpoint, OpenAIAdapter } from "@copilotkit/runtime"; import { NextApiRequest, NextApiResponse } from "next"; import OpenAI from "openai"; const handler = async (req: NextApiRequest, res: NextApiResponse) => { // Extract cookies from the request const originalCookies = Object.entries(req.cookies) .map(([key, value]) => `${key}=${value}`) .join("; "); // Extract sAccessToken for x-access-token header const accessToken = req.cookies['sAccessToken'] || ''; console.log("Original cookies captured:", originalCookies); console.log("Access token for x-access-token:", accessToken); // Store the original fetch function const originalFetch = global.fetch; global.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { const url = typeof input === "string" ? input : input.toString(); // Add custom headers for requests to the /copilotkit endpoint if (url.includes(`${process.env.ADMIN_AGENT}/copilotkit`)) { const modifiedInit = { ...init, headers: { ...init?.headers, Cookie: originalCookies, // Retain original cookies 'x-access-token': accessToken // Add custom x-access-token header } }; console.log("Adding cookies and x-access-token to request:", { cookies: originalCookies, 'x-access-token': accessToken }); console.log("Full fetch init:", JSON.stringify(modifiedInit, null, 2)); return originalFetch(input, modifiedInit); } // Fallback to original fetch for other requests return originalFetch(input, init); }; // Initialize CopilotRuntime with remote endpoint const runtime = new CopilotRuntime({ remoteEndpoints: [ copilotKitEndpoint({ url: `${process.env.ADMIN_AGENT}/copilotkit` }) ] }); // Create the request handler const handleRequest = copilotRuntimeNextJSPagesRouterEndpoint({ endpoint: "/api/copilotkit", runtime, serviceAdapter: new OpenAIAdapter({ openai: new OpenAI({ apiKey: "" }) }) }); try { return await handleRequest(req, res); } finally { // Restore original fetch function global.fetch = originalFetch; } }; export default handler;
解决方案
问题出在你通过替换global.fetch注入请求头的方式——这种全局修改的方式不可靠,CopilotRuntime内部可能在初始化阶段就绑定了原始fetch方法,或者并发请求时全局fetch的修改会被覆盖,导致后续请求复用旧Cookie。
正确做法是利用CopilotKit官方提供的copilotKitEndpoint配置项,直接在创建远程端点时注入当前请求的上下文头信息,无需修改全局fetch:
import { copilotKitEndpoint, CopilotRuntime, copilotRuntimeNextJSPagesRouterEndpoint, OpenAIAdapter } from "@copilotkit/runtime"; import { NextApiRequest, NextApiResponse } from "next"; import OpenAI from "openai"; const handler = async (req: NextApiRequest, res: NextApiResponse) => { // Extract cookies from the request const originalCookies = Object.entries(req.cookies) .map(([key, value]) => `${key}=${value}`) .join("; "); // Extract sAccessToken for x-access-token header const accessToken = req.cookies['sAccessToken'] || ''; console.log("Original cookies captured:", originalCookies); console.log("Access token for x-access-token:", accessToken); // Initialize CopilotRuntime with remote endpoint, using requestInit to inject headers const runtime = new CopilotRuntime({ remoteEndpoints: [ copilotKitEndpoint({ url: `${process.env.ADMIN_AGENT}/copilotkit`, // 每次CopilotRuntime发起请求时,都会执行这个回调注入当前请求的最新头信息 requestInit: () => ({ headers: { Cookie: originalCookies, 'x-access-token': accessToken } }) }) ] }); // Create the request handler const handleRequest = copilotRuntimeNextJSPagesRouterEndpoint({ endpoint: "/api/copilotkit", runtime, serviceAdapter: new OpenAIAdapter({ openai: new OpenAI({ apiKey: "" }) }) }); return await handleRequest(req, res); }; export default handler;
关键改动说明
- 移除全局
fetch的替换与恢复逻辑,避免全局状态污染和并发请求冲突 - 在
copilotKitEndpoint中添加requestInit回调函数,确保每次请求都使用当前上下文的最新Cookie和自定义头 - 该方案是CopilotKit官方设计的自定义请求配置方式,更稳定且符合框架规范
内容的提问来源于stack exchange,提问作者Akhil Varghese
相关产品推荐
相关产品推荐

