Next.js 13 route.ts设置Cookie报错:TypeError: cookies is not iterable
问题重现
在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)
错误原因
- 响应处理逻辑冲突:在Route Handler中混用
cookies()工具和手动返回NextResponse对象,导致Next.js内部处理响应头时出现迭代异常。 - 版本兼容性问题:旧版本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
相关产品推荐
相关产品推荐

