experimental.proxyClientMaxBodySize
当使用代理时,Next.js 会自动克隆请求正文并将其缓存在内存中,以实现代理和底层路由处理器中的多次读取。为防止内存使用过多,此配置选项对缓冲的正文设置了大小限制。
默认情况下,最大正文大小为 **10MB**。如果请求正文超出此限制,正文将仅缓冲到此限制,并且会记录一条警告,指示哪个路由超出了限制。
选项
字符串格式(推荐)
使用人类可读的字符串格式指定大小
next.config.ts
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
experimental: {
proxyClientMaxBodySize: '1mb',
},
}
export default nextConfig
支持的单位:b
、kb
、mb
、gb
数字格式
或者,以字节为单位的数字形式指定大小
next.config.ts
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
experimental: {
proxyClientMaxBodySize: 1048576, // 1MB in bytes
},
}
export default nextConfig
行为
当请求正文超出配置的限制时
- Next.js 将只缓冲前 N 个字节(达到限制)
- 控制台将记录一条警告,指示超出限制的路由
- 请求将继续正常处理,但只能获取部分正文
- 请求**不会**失败或向客户端返回错误
如果您的应用程序需要处理完整的请求正文,您应该:
- 增加
proxyClientMaxBodySize
限制 - 在您的应用程序逻辑中优雅地处理部分正文
示例
proxy.ts
import { NextRequest, NextResponse } from 'next/server'
export async function proxy(request: NextRequest) {
// Next.js automatically buffers the body with the configured size limit
// You can read the body in proxy...
const body = await request.text()
// If the body exceeded the limit, only partial data will be available
console.log('Body size:', body.length)
return NextResponse.next()
}
app/api/upload/route.ts
import { NextRequest, NextResponse } from 'next/server'
export async function POST(request: NextRequest) {
// ...and the body is still available in your route handler
const body = await request.text()
console.log('Body in route handler:', body.length)
return NextResponse.json({ received: body.length })
}
须知
- 此设置仅在您的应用程序中使用代理时适用
- 默认的 10MB 限制旨在平衡内存使用和典型用例
- 该限制适用于每个请求,而不是所有并发请求的全局限制
- 对于处理大文件上传的应用程序,请考虑相应地增加限制
这有帮助吗?