Menu

proxyClientMaxBodySize

proxyを使用する場合、Next.jsはリクエストボディを自動的にクローンしてメモリにバッファリングし、proxy と基盤となるroute handlerの両方で複数回の読み込みを可能にします。メモリ使用量の過剰を防ぐため、この設定オプションはバッファリングされたボディのサイズ制限を設定します。

デフォルトでは、最大ボディサイズは10MBです。リクエストボディがこの制限を超える場合、ボディは制限までのみバッファリングされ、制限を超えたroute を示す警告がログに出力されます。

オプション

文字列形式(推奨)

人間が読みやすい文字列形式でサイズを指定します:

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

サポートされている単位:bkbmbgb

数値形式

別の方法として、サイズをバイト単位の数値で指定します:

next.config.ts
TypeScript
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  experimental: {
    proxyClientMaxBodySize: 1048576, // 1MBをバイト単位で表記
  },
}
 
export default nextConfig

動作

リクエストボディが設定された制限を超える場合:

  1. Next.jsは最初のNバイト(制限まで)のみバッファリングします
  2. 制限を超えたrouteを示す警告がコンソールにログされます
  3. リクエストは通常通り処理を継続しますが、部分的なボディのみが利用可能になります
  4. リクエストは失敗せず、クライアントにエラーを返しませんしません

アプリケーションが完全なリクエストボディを処理する必要がある場合は、以下のどちらかを実施する必要があります:

  • proxyClientMaxBodySizeの制限を増加させる
  • アプリケーションロジック内で部分的なボディを適切に処理する

proxy.ts
import { NextRequest, NextResponse } from 'next/server'
 
export async function proxy(request: NextRequest) {
  // Next.jsは設定されたサイズ制限でボディを自動的にバッファリングします
  // proxyでボディを読み込むことができます...
  const body = await request.text()
 
  // ボディが制限を超えた場合、部分的なデータのみが利用可能です
  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) {
  // ...そしてボディはroute handlerでも利用可能です
  const body = await request.text()
 
  console.log('Body in route handler:', body.length)
 
  return NextResponse.json({ received: body.length })
}

補足

  • この設定は、アプリケーションでproxyを使用する場合にのみ適用されます
  • デフォルトの10MB制限は、メモリ使用量と一般的なユースケースのバランスを取るように設計されています
  • この制限はリクエストごとに適用され、すべての並行リクエスト全体には適用されません
  • 大規模なファイルアップロードを処理するアプリケーションの場合、制限をそれに応じて増加させることを検討してください