ルートハンドラ
ルートハンドラ(Route Handlers)を使用すると、WebのRequestおよびResponse APIを活用して、特定のルートにカスタムリクエストハンドラを作成できます。

豆知識: ルートハンドラは
app
ディレクトリ内でのみ利用可能です。これはpages
ディレクトリ内のAPIルートと同等の機能を提供するため、APIルートとルートハンドラを同時に使用する必要はありません。
規約
ルートハンドラはapp
ディレクトリ内のroute.js|ts
ファイルで定義されます:
ルートハンドラはpage.js
やlayout.js
と同様に、app
ディレクトリ内の任意の場所にネストできます。ただし、page.js
と同じルートセグメントレベルにroute.js
ファイルを配置することはできません。
サポートされるHTTPメソッド
以下のHTTPメソッドがサポートされています:GET
、POST
、PUT
、PATCH
、DELETE
、HEAD
、およびOPTIONS
。サポートされていないメソッドが呼び出された場合、Next.jsは405 Method Not Allowed
レスポンスを返します。
拡張されたNextRequest
とNextResponse
API
Next.jsはネイティブのRequestおよびResponse APIに加えて、NextRequest
とNextResponse
を拡張し、高度なユースケースに対応する便利なヘルパーを提供します。
動作
キャッシュ
ルートハンドラはデフォルトでキャッシュされません。ただし、GET
メソッドに対してキャッシュを有効にすることができます。他のHTTPメソッドはキャッシュされません。GET
メソッドをキャッシュするには、ルートハンドラファイルでexport const dynamic = 'force-static'
などのルート設定オプションを使用します。
豆知識: 他のHTTPメソッドは、キャッシュされた
GET
メソッドと同じファイルに配置されていても、キャッシュされません。
特別なルートハンドラ
sitemap.ts
、opengraph-image.tsx
、icon.tsx
などの特別なルートハンドラやその他のメタデータファイルは、Dynamic 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や機能と組み合わせる方法を示しています。
キャッシュデータの再検証
インクリメンタル静的再生成(ISR)を使用してキャッシュデータを再検証できます:
Cookie
next/headers
のcookies
を使用してCookieを読み書きできます。このサーバー関数はルートハンドラで直接呼び出すか、他の関数内にネストできます。
または、Set-Cookie
ヘッダーを使用して新しいResponse
を返すこともできます。
基盤となるWeb APIを使用して、リクエスト(NextRequest
)からCookieを読み取ることもできます:
ヘッダー
next/headers
のheaders
を使用してヘッダーを読み取れます。このサーバー関数はルートハンドラで直接呼び出すか、他の関数内にネストできます。
このheaders
インスタンスは読み取り専用です。ヘッダーを設定するには、新しいheaders
を含む新しいResponse
を返す必要があります。
基盤となるWeb APIを使用して、リクエスト(NextRequest
)からヘッダーを読み取ることもできます:
リダイレクト
動的ルートセグメント
ルートハンドラは動的セグメントを使用して、動的データからリクエストハンドラを作成できます。
ルート | 例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' }> |
URLクエリパラメータ
ルートハンドラに渡されるリクエストオブジェクトはNextRequest
インスタンスで、クエリパラメータをより簡単に処理するための便利なメソッドが含まれています。
ストリーミング
ストリーミングは、OpenAIなどの大規模言語モデル(LLM)と組み合わせて、AI生成コンテンツに使用されることが一般的です。AI SDKについて詳しく学びましょう。
これらの抽象化はWeb APIを使用してストリームを作成します。基盤となるWeb APIを直接使用することもできます。
リクエストボディ
標準のWeb APIメソッドを使用してRequest
ボディを読み取れます:
リクエストボディのFormData
request.formData()
関数を使用してFormData
を読み取れます:
formData
データはすべて文字列であるため、zod-form-data
を使用してリクエストを検証し、希望する形式(例:number
)でデータを取得することが望ましい場合があります。
CORS
標準のWeb APIメソッドを使用して、特定のルートハンドラにCORSヘッダーを設定できます:
豆知識:
- 複数のルートハンドラにCORSヘッダーを追加するには、ミドルウェアまたは
next.config.js
ファイルを使用できます。- または、CORSの例パッケージを参照してください。
Webhook (ウェブフック)
サードパーティサービスからのウェブフックを受信するために、ルートハンドラを使用できます:
特筆すべきは、Pages RouterのAPIルートとは異なり、追加の設定やbodyParser
を使用する必要がない点です。
非UIレスポンス
ルートハンドラを使用してUI以外のコンテンツを返すことができます。sitemap.xml
、robots.txt
、app icons
、open graph imagesにはすべて組み込みのサポートがあります。
セグメント設定オプション
ルートハンドラは、ページやレイアウトと同じルートセグメント設定を使用します。
詳細についてはAPIリファレンスを参照してください。