无法配置Vercel接收超100MB请求负载的问题排查
Vercel API Routes 大请求体负载配置解决方案
你遇到的问题核心是Vercel平台对常规API Routes的请求体有硬限制,同时默认body parser的额外限制也会导致配置不生效,以下是具体分析和可行方案:
问题原因
- 常规API Routes的平台硬上限是100MB,即便你配置
sizeLimit: '200mb',超过100MB的请求依然会触发413错误。 - ES模块格式的
export const config未生效,大概率是文件格式不匹配(比如.js文件未在package.json中声明"type": "module"),导致Vercel未识别配置,沿用了默认的4MB body parser限制。
可行解决方案
方案1:处理100MB以内的请求
关闭默认body parser,手动处理请求流,绕过中间层限制,同时确保配置格式正确:
- 如果用CommonJS格式(
.js文件,无"type": "module"):
module.exports = { api: { bodyParser: false, // 关闭默认解析,手动处理请求体 }, }; export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).end(); } // 手动收集请求流数据 const chunks = []; for await (const chunk of req) { chunks.push(chunk); } const requestBuffer = Buffer.concat(chunks); // 这里添加你的业务逻辑,比如将buffer上传至存储服务等 res.status(200).json({ success: true, payloadSize: requestBuffer.length }); }
- 如果用ES模块格式(
.mjs文件或package.json中设"type": "module"):
export const config = { api: { bodyParser: false, }, }; export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).end(); } const chunks = []; for await (const chunk of req) { chunks.push(chunk); } const requestBuffer = Buffer.concat(chunks); res.status(200).json({ success: true, payloadSize: requestBuffer.length }); }
方案2:处理超过100MB的请求
常规API Routes无法突破100MB的平台硬限制,需改用以下两种方案:
- 使用Vercel Edge Functions:
Edge Functions的请求体上限为256MB,需启用Edge Runtime,注意使用Web标准API而非Node.js特定API:
export const config = { runtime: 'edge', // 启用Edge Runtime }; export default async function handler(req) { if (req.method !== 'POST') { return new Response('Method Not Allowed', { status: 405 }); } const requestData = await req.arrayBuffer(); // 处理数据逻辑 return new Response(JSON.stringify({ success: true, payloadSize: requestData.byteLength }), { headers: { 'Content-Type': 'application/json' }, }); }
- 客户端直传云存储:
让客户端直接将大文件上传至AWS S3、Cloudflare R2等云存储服务,上传完成后仅向Vercel API发送文件地址,由API后续处理文件,彻底绕过请求体大小限制。
内容的提问来源于stack exchange,提问作者benxha
相关产品推荐
相关产品推荐

