在POST请求中使用multipart/form-data上传图片时,Next.js API返回500错误

前端开发 2026-07-09

enter image description here

我正在做一个Next.js项目,并在Apidog中测试一个POST API端点。

端点:

POST http://localhost:3000/api/blog

请求体:

我正在使用 multipart/form-data 发送以下字段:

  • 标题
  • 描述
  • 作者
  • 作者图片
  • 分类
  • image(文件上传)

问题:

API返回:

  • 500内部服务器错误
  • 响应体为空
  • 验证提示:

  • HTTP状态码应为200

  • 内容类型应为JSON

我的问题:

  • 为什么在发送带图片上传的表单数据时,我的Next.js API会返回500?
  • 在Next.js API路由中,multipart/form-data 需要特殊处理吗?

额外信息:

我怀疑问题与文件上传解析或body parser配置有关。

我需要的帮助:

  • 如何在Next.js API路由中处理文件上传
  • 为什么会出现500错误
  • 返回JSON响应的正确方式

解决方案

multipart/form-data 带文件上传(image)的请求在Next.js API路由中不会像JSON请求那样自动解析。

这就是你的API返回 500 的原因——req.body 通常是空的/未定义的,在访问该文件时会导致服务器崩溃。

备选方案

是的,在Next.js中你需要对 multipart/form-data 进行特殊处理。内置的body parser无法处理文件上传——很可能就是你得到500的原因。

根本原因
Next.js API路由使用会处理 application/jsonapplication/x-www-form-urlencoded 的内置body parser,但并不处理 multipart/form-data。当你的路由在没有正确解析器的情况下尝试读取请求体时,要么抛错,要么不返回任何内容——因此出现空的500。

解决办法:禁用默认的body parser
在路由文件的顶部,导出一个配置以关闭内置解析器:

// app/api/blog/route.js (App Router)
export const config = {
  api: {
    bodyParser: false,
  },
};

在所有内容周围添加一个 try/catch,并在catch块中始终返回一个JSON响应(如上所示)。导致空500的最常见原因是:

  1. 未捕获的 throw,且没有错误处理程序
  2. bodyParser被禁用时尝试调用 req.body(它会是 undefined
  3. 在未解析的请求上访问 formData.get()
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章