Next.js API报错TypeError: req.formData is not a function,求排查方案
解决Next.js中
req.formData is not a function的问题 针对你遇到的错误,主要有以下几个可能的原因及对应的解决方案:
1. 路由文件结构不符合规范
你使用的是App Router的API写法(NextRequest/NextResponse + 导出POST函数),必须确保路由文件放在app/api/目录下,比如app/api/upload/route.ts。如果放在pages/api/目录下,属于Pages Router的API路由,此时的req是Node.js的IncomingMessage对象,并不存在formData()方法,两种路由体系的写法不能混用。
2. Next.js版本过低(Node.js Runtime场景)
如果使用默认的Node.js Runtime(未指定runtime: 'edge'),req.formData()方法是在Next.js 13.2版本才引入的。若你的版本低于13.2,会出现该错误,解决方式有两种:
- 升级Next.js到13.2或更高版本;
- 改用第三方库(如
formidable)解析multipart/form-data,示例代码如下:
首先安装依赖:
然后修改API路由代码(App Router场景,需禁用内置body解析):npm install formidableimport { NextResponse } from 'next/server'; import formidable from 'formidable'; import { Readable } from 'stream'; export const config = { api: { bodyParser: false, // 禁用内置body解析,让formidable处理 }, }; export default async function POST(req: Request) { const form = formidable({}); // 将Web流转换为Node.js可读流 const readableStream = Readable.fromWeb(req.body as ReadableStream); const [_, files] = await form.parse(readableStream); const file = files.file?.[0]; if (!file) { return NextResponse.json({ success: false }, { status: 400 }); } return NextResponse.json({ success: true }); }
3. 请求格式错误
确保请求的Content-Type正确设置为multipart/form-data,且请求体包含正确的边界符(boundary)。如果是手动构造请求,需注意边界符要与请求头中指定的一致;如果是通过表单提交,浏览器会自动处理边界符,无需手动设置。
Edge Runtime场景的额外检查
如果使用Edge Runtime,确认config配置正确,且你的Next.js版本在13.0及以上(Edge Runtime从13.0开始支持req.formData()):
export const config = { runtime: 'edge', };
Edge环境下无法使用Node.js内置模块和依赖Node环境的库(如formidable),必须使用req.formData()来解析表单数据。
内容的提问来源于stack exchange,提问作者Ahmer Saud
相关产品推荐
相关产品推荐

