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

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,示例代码如下:
    首先安装依赖:
    npm install formidable
    
    然后修改API路由代码(App Router场景,需禁用内置body解析):
    import { 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:32:53