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

我正在做一个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/json 和 application/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的最常见原因是:
- 未捕获的
throw,且没有错误处理程序 - bodyParser被禁用时尝试调用
req.body(它会是undefined) - 在未解析的请求上访问
formData.get()
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。