ルートハンドラー
ルートハンドラーを使用すると、Web の Request と Response API を使用して、特定のルートのカスタムリクエストハンドラーを作成できます。
補足: ルートハンドラーは app
ディレクトリ内でのみ利用可能です。これは pages
ディレクトリ内の API Routes と同等の機能であり、API Routes とルートハンドラーを一緒に使用する必要はありません。
ルートハンドラーは app
ディレクトリ内の route.js|ts
ファイルで定義します:
ルートハンドラーは page.js
や layout.js
と同様に、app
ディレクトリ内のどこにでも入れ子にできます。ただし、page.js
と同じルートセグメントレベルに route.js
ファイルを配置することはできません。
以下の HTTP メソッドがサポートされています:GET
、POST
、PUT
、PATCH
、DELETE
、HEAD
、OPTIONS
。サポートされていないメソッドが呼び出された場合、Next.js は 405 Method Not Allowed
レスポンスを返します。
ネイティブの Request と Response API をサポートすることに加えて、Next.js は NextRequest
と NextResponse
を拡張し、高度なユースケースに便利なヘルパーを提供します。
ルートハンドラーはデフォルトではキャッシュされません。ただし、GET
メソッドのキャッシュを選択できます。他のサポートされる HTTP メソッドはキャッシュされません。GET
メソッドをキャッシュするには、ルートハンドラーファイルで export const dynamic = 'force-static'
などのルート設定オプションを使用します。
補足: 他のサポートされる HTTP メソッドは、同じファイル内でキャッシュされる GET
メソッドと並んでいても、キャッシュされません。
sitemap.ts
、opengraph-image.tsx
、icon.tsx
、その他のメタデータファイルなどの特殊なルートハンドラーは、動的 API や動的設定オプションを使用しない限り、デフォルトで静的のままです。
route
は、最も低レベルのルーティングプリミティブと考えることができます。
- レイアウトやクライアント側のナビゲーションに参加しません(
page
とは異なります)。
page.js
と同じルートに route.js
ファイルを配置することはできません。
ページ | ルート | 結果 |
---|
app/page.js | app/route.js | 競合 |
app/page.js | app/api/route.js | 有効 |
app/[user]/page.js | app/api/route.js | 有効 |
各 route.js
または page.js
ファイルは、そのルートのすべての HTTP 動詞を引き受けます。
以下の例は、ルートハンドラーを他の Next.js の API や機能と組み合わせる方法を示しています。
増分静的再生成(Incremental Static Regeneration、ISR)を使用して、キャッシュされたデータを再検証できます:
next/headers
の cookies
を使用して、クッキーを読み取りまたは設定できます。このサーバー関数は、ルートハンドラーで直接呼び出すか、別の関数内でネストできます。
あるいは、Set-Cookie
ヘッダーを使用して新しい Response
を返すこともできます。
基盤となる Web API を使用して、リクエストからクッキーを読み取ることもできます(NextRequest
):
next/headers
の headers
を使用してヘッダーを読み取ることができます。このサーバー関数は、ルートハンドラーで直接呼び出すか、別の関数内でネストできます。
この headers
インスタンスは読み取り専用です。ヘッダーを設定するには、新しいヘッダーを持つ新しい Response
を返す必要があります。
基盤となる Web API を使用して、リクエストからヘッダーを読み取ることもできます(NextRequest
):
続ける前に、ルート定義のページを読むことをお勧めします。
Route Handlerは、動的セグメントを使用して、動的データからリクエストハンドラーを作成できます。
ルート | 例のURL | params |
---|
app/items/[slug]/route.js | /items/a | Promise<{ slug: 'a' }> |
app/items/[slug]/route.js | /items/b | Promise<{ slug: 'b' }> |
app/items/[slug]/route.js | /items/c | Promise<{ slug: 'c' }> |
Route Handlerに渡されるリクエストオブジェクトは、いくつかの追加の便利なメソッドを持つNextRequest
インスタンスで、クエリパラメータを簡単に処理できます。
ストリーミングは、大規模言語モデル(LLM)、OpenAIなどと組み合わせて、AIで生成されたコンテンツに一般的に使用されます。詳しくはAI SDKをご覧ください。
これらの抽象化はWeb APIを使用してストリームを作成します。基盤となるWeb APIを直接使用することもできます。
標準のWeb APIメソッドを使用して、Request
のボディを読み取ることができます:
request.formData()
関数を使用してFormData
を読み取ることができます:
formData
のデータはすべて文字列であるため、リクエストを検証し、希望の形式(例:number
)でデータを取得するには、zod-form-data
の使用をお勧めします。
標準のWeb APIメソッドを使用して、特定のRoute Handlerに対するCORSヘッダーを設定できます:
補足:
サードパーティサービスからのWebhookを受信するためにRoute Handlerを使用できます:
特筆すべきは、PagesルーターのAPIルートとは異なり、追加の設定を使用するためにbodyParser
を使用する必要がないことです。
Route Handlersを使用して、UI以外のコンテンツを返すことができます。sitemap.xml
、robots.txt
、アプリアイコン
、オープングラフ画像はすべて組み込みのサポートがあることに注意してください。
Route Handlersは、ページやレイアウトと同じルートセグメント設定を使用します。
詳細については、APIリファレンスを参照してください。