跳到內容
配置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 限制旨在平衡記憶體使用和典型用例
  • 此限制適用於每個請求,而不是所有併發請求的全侷限制
  • 對於處理大型檔案上傳的應用程式,請相應地增加限制