Next.js API 上传大文件时请求挂起问题求助
解决Next.js API路由大文件Multipart请求挂起问题
问题本质
你设置了bodyParser: false和responseLimit: false但大文件请求仍挂起,核心原因是:禁用自动解析后,你没有手动处理multipart请求体的数据流。Next.js不会自动读取请求内容,客户端会一直等待服务器读取完数据并返回响应,导致请求长时间挂起。
解决方案
需要手动解析multipart格式的请求体,这里以formidable库为例(适配TS环境):
1. 安装依赖
npm install formidable @types/formidable
2. 修改API端点代码
import type { NextApiRequest, NextApiResponse } from 'next'; import formidable from 'formidable'; export const config = { api: { externalResolver: true, bodyParser: false, responseLimit: false } }; export default async (req: NextApiRequest, res: NextApiResponse) => { if (req.method !== 'POST') { return res.status(405).end('Method Not Allowed'); } const form = formidable({ // 可自定义配置,比如设置文件最大限制: // maxFileSize: 100 * 1024 * 1024 // 允许100MB文件 }); // 手动解析请求体,消费数据流 form.parse(req, (err, fields, files) => { if (err) { console.error('请求体解析失败:', err); return res.status(500).end('解析失败'); } console.log('OK'); console.log('表单字段:', fields); console.log('上传文件:', files); // 解析完成后返回响应,结束请求 res.status(200).end('文件上传处理完成'); }); };
关键说明
bodyParser: false确实禁用了Next.js自动解析,但此时必须手动处理请求流,否则客户端会因未收到响应而挂起。externalResolver: true要保留,告诉Next.js由你负责处理响应逻辑,避免框架触发超时判定。- 也可以用
busboy等其他multipart解析库,核心逻辑都是必须读取并消费完请求体数据流,再返回响应。
内容的提问来源于stack exchange,提问作者dna
相关产品推荐
相关产品推荐

