跳到内容
配置next.config.jsproxyClientMaxBodySize

proxyClientMaxBodySize

此功能目前处于实验阶段,可能会有所更改,不建议用于生产环境。欢迎试用并在 GitHub 上分享您的反馈。

当使用代理时,Next.js 会自动克隆请求正文并将其缓存在内存中,以实现多次读取——无论是在代理中还是在底层路由处理程序中。为防止内存使用过多,此配置选项会设置一个缓冲正文的大小限制。

默认情况下,最大正文大小为 10MB。如果请求正文超出此限制,正文将仅缓冲到此限制,并将记录一条警告,指出哪个路由超出了限制。

选项

使用人类可读的字符串格式指定大小

next.config.ts
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  experimental: {
    proxyClientMaxBodySize: '1mb',
  },
}
 
export default nextConfig

支持的单位:bkbmbgb

数字格式

或者,将大小指定为以字节为单位的数字

next.config.ts
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  experimental: {
    proxyClientMaxBodySize: 1048576, // 1MB in bytes
  },
}
 
export default nextConfig

行为

当请求正文超出配置的限制时

  1. Next.js 将只缓冲前 N 个字节(达到限制)
  2. 控制台将记录一条警告,指出超出限制的路由
  3. 请求将继续正常处理,但只有部分正文可用
  4. 请求将不会失败或向客户端返回错误

如果您的应用程序需要处理完整的请求正文,您应该

  • 增加 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 限制旨在平衡内存使用和典型用例
  • 此限制适用于每个请求,而不是所有并发请求的全局限制
  • 对于处理大型文件上传的应用程序,请相应地增加限制