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

Next.js13中Turbopack与Webpack下response.headers结构差异致Cookie获取异常

解决Next.js 13中Webpack环境下无法正确获取API返回Set-Cookie的问题

问题背景

在Next.js 13项目对接第三方API认证时,切换打包工具后出现Headers结构不一致的问题:

  • Turbopack环境:response.headers提供raw()方法,set-cookie返回字符串数组,可直接遍历处理。
  • Webpack环境:response.headers遵循标准Fetch API实现,无raw()方法,set-cookie返回合并后的单个字符串,直接调用raw()会报错response.headers.raw is not a function。

解决方案

针对两种打包工具的Headers差异,编写兼容逻辑:

  1. 先判断headers是否存在raw()方法,区分运行环境。
  2. Webpack环境下,将合并的set-cookie字符串拆分为单个cookie条目(注意避免拆分cookie内部的逗号,比如expires字段的日期)。

修改后的代码实现

更新parseCookies函数,添加兼容处理:

function parseCookies(response: any) {
  let setCookieEntries: string[];

  // 兼容Turbopack的raw()方法和Webpack的标准Headers
  if (typeof response.headers.raw === 'function') {
    setCookieEntries = response.headers.raw()['set-cookie'] || [];
  } else {
    const setCookieStr = response.headers.get('set-cookie');
    if (!setCookieStr) {
      setCookieEntries = [];
    } else {
      // 用正则分割多个Set-Cookie条目:匹配逗号后紧跟非空格字符的位置(即新cookie的开头)
      setCookieEntries = setCookieStr.split(/,(?=[^ ])/);
    }
  }

  return setCookieEntries
    .map(entry => {
      const parts = entry.split(';');
      // 提取cookie的键值对部分(忽略后续属性如expires、path等)
      return parts[0];
    })
    .join(';');
}

关键说明

  • 标准Fetch API中,Headers.get('set-cookie')会将多个Set-Cookie头合并为一个用逗号分隔的字符串,因此需要用正则正确拆分。
  • 正则/(?=[^ ])/是正向预查,确保只拆分分隔不同cookie的逗号,不会误拆单个cookie内部的逗号(比如expires=Wed, 21 Oct 2025 07:28:00 GMT中的逗号)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:05:18