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

Next.js 13 route.ts设置Cookie报错:TypeError: cookies is not iterable

Next.js 13 Route Handler设置Cookie触发「TypeError: cookies is not iterable」500错误解决

问题重现

在Next.js 13的route.ts中尝试两种方式设置Cookie,均触发500内部服务器错误,报错信息为TypeError: cookies is not iterable:

方式一:使用Next.js内置cookies库

import { cookies } from "next/headers";
import { NextResponse } from "next/server";

export async function GET(request: Request) {
  const token = "asdfasdf";

  cookies().set("token", token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === "production",
    sameSite: "strict",
    path: "/",
    maxAge: 60 * 60 * 24,
  });

  return NextResponse.json({}, { status: 200 });
}

方式二:手动设置Set-Cookie响应头

import { NextResponse } from "next/server";
import { serialize } from "cookie";

export async function GET(request: Request) {
  const token = "asdfasdf";

  const serialized = serialize("token", token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === "production",
    sameSite: "strict",
    path: "/",
    maxAge: 60 * 60 * 24,
  });

  return NextResponse.json({}, {
    status: 200,
    headers: { "Set-Cookie": serialized },
  });
}

错误栈:

TypeError: cookies is not iterable
    at get [headers map sorted] (node:internal/deps/undici/undici:1844:34)
    at node:internal/deps/undici/undici:1865:43
    at Headers Iterator.next (node:internal/deps/undici/undici:1108:26)
    at toNodeOutgoingHttpHeaders (/Users/luqmanmalik/Documents/Web Projects/Next/alternata-book-web/node_modules/next/dist/server/web/utils.js:106:31)
    at invokeRender (/Users/luqmanmalik/Documents/Web Projects/Next/alternata-book-web/node_modules/next/dist/server/lib/router-server.js:275:122)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async handleRequest (/Users/luqmanmalik/Documents/Web Projects/Next/alternata-book-web/node_modules/next/dist/server/lib/router-server.js:447:24)
    at async requestHandler (/Users/luqmanmalik/Documents/Web Projects/Next/alternata-book-web/node_modules/next/dist/server/lib/router-server.js:464:13)
    at async Server.<anonymous> (/Users/luqmanmalik/Documents/Web Projects/Next/alternata-book-web/node_modules/next/dist/server/lib/start-server.js:117:13)

错误原因

  1. 响应处理逻辑冲突:在Route Handler中混用cookies()工具和手动返回NextResponse对象,导致Next.js内部处理响应头时出现迭代异常。
  2. 版本兼容性问题:旧版本Next.js(13.4之前)与Node.js内置的undici库存在headers迭代的兼容性bug。

解决方法

方法一:使用NextResponse内置的cookies方法(推荐)

直接通过NextResponse实例的cookies方法设置Cookie,避免响应处理逻辑冲突:

import { NextResponse } from "next/server";

export async function GET(request: Request) {
  const token = "asdfasdf";
  const response = NextResponse.json({}, { status: 200 });

  response.cookies.set("token", token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === "production",
    sameSite: "strict",
    path: "/",
    maxAge: 60 * 60 * 24,
  });

  return response;
}

方法二:修正手动设置Set-Cookie的写法(确保版本兼容)

如果坚持手动设置响应头,需确保Next.js版本升级到13.4+,同时避免与cookies()工具混用:

import { NextResponse } from "next/server";
import { serialize } from "cookie";

export async function GET(request: Request) {
  const token = "asdfasdf";
  const serialized = serialize("token", token, {
    httpOnly: true,
    secure: process.env.NODE_ENV === "production",
    sameSite: "strict",
    path: "/",
    maxAge: 60 * 60 * 24,
  });

  return NextResponse.json({}, {
    status: 200,
    headers: { "Set-Cookie": serialized }
  });
}

额外排查步骤

  • 升级Next.js到13.4及以上稳定版,修复已知的Route Handler响应头bug
  • 使用Node.js 18.x或20.x LTS版本,避免undici库的兼容性问题
  • 不要在同一个Route Handler中同时使用cookies()工具和手动修改响应头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:53:25