Next.js APIルート:Route Handlerの実装例

Next.js Route Handlerの実装例

Next.js APIルート(Route Handler):GET、POST、認証 | We.Inc

App Router向けのNext.js Route Handlerの実装例集。クエリパラメーター付きのGET、バリデーション付きのPOST、Promiseとして渡される動的パラメーター、認証チェック、CORS、Webhookをコピーして使えます。

App Routerでは、APIエンドポイントはappの中に置くroute.tsファイルです。例:app/api/todos/route.ts。GETやPOSTなどHTTPメソッド名の非同期関数をエクスポートします。各関数はRequestを受け取ってResponseを返し、通常はResponse.json()を使います。動的セグメントはプロミスとして渡されるので、待機して値を取り出します。Next.js 15以降、GETハンドラーはデフォルトで動的です。

Route Handlerの基本

Pages RouterのAPIルートはreqとresオブジェクトを使っていました。一方Route Handlerは、標準のWeb RequestとResponseを使います。古い回答をそのままコピーすると、ここでつまずきがちです。以下では、実際のアプリで必要になるパターンを、すべて現行のApp Router向けに紹介します。さらに、バリデーションを行うPOSTが返すべきステータスコードを確認できる小さなテスターも用意しています。

よくある質問

Next.jsのAPIルートは非推奨になったのですか?

Pages Routerではpages/apiのルートが引き続き動作します。App Routerでそれに相当するのがRoute Handlerで、Web RequestとResponseオブジェクトを使うroute.tsファイルです。bodyParserの設定は不要です。

route.tsはどのHTTPメソッドをエクスポートできますか?

GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONSです。エクスポートしていないメソッドを呼び出すと、405 Method Not Allowedが返ります。

なぜparamsをawaitする必要があるのですか?

Next.js 15以降、コンテキスト引数のparamsはプロミスになりました。const { id } = await paramsと書きます。next dev、next build、next typegenで生成されるRouteContextヘルパー型を使えば、ルートのパスから型付きのparamsが得られます。

GETのRoute Handlerはキャッシュされますか?

現在はデフォルトではキャッシュされません。Next.js 15でGETハンドラーは静的から動的に変更されました。キャッシュを再び有効にするには、export const dynamic = 'force-static'かrevalidateの値を指定します。Cache Componentsを有効にしている場合は、use cacheをハンドラー本体ではなく、ハンドラーが呼び出すヘルパー関数の中に書きます。

Route HandlerとServer Actionのどちらを使うべきですか?

自分のフォームやボタンから実行するデータ変更にはServer Actionを使います。モバイルアプリ、Webhook、cronジョブ、外部のスクリプトなど、Reactのツリーの外からURLを呼び出す場合はRoute Handlerを使います。

ファイル構成

クライアントが理解できるステータスコード

セキュリティのチェックリスト

Route Handlerの実装例

検索クエリ付きのGET

app/api/todos/route.ts。qパラメーターでリストを絞り込み、クエリが空ならすべてを返します。

Zodによるバリデーションと認証チェック付きのPOST

セッションがなければ401、ボディが不正なら項目ごとのエラーとともに400、それ以外は新しいレコードとともに201を返します。getSessionは、お使いの認証ライブラリの代わりとして置いています。

paramsをawaitする動的セグメント

app/api/todos/[id]/route.ts。Next.js 15以降、paramsはPromiseです。

信頼できる1つのオリジン向けのCORS

ブラウザーのプリフライトと実際のリクエストの両方に、同じ許可オリジンで応答します。

Client Componentからハンドラーを呼び出す

fetchヘルパーが最初にステータスコードを読むので、フォームは400の項目別エラーを表示できます。

Pages RouterのAPIルートとRoute Handlerの比較

同じ処理、異なるAPI

POSTテスター

JSONボディを編集し、呼び出し元がサインインしているかを選ぶと、バリデーションを行うPOSTの例が返すステータスコードとレスポンスを確認できます。

メソッド

リクエストボディ(JSON)

呼び出し元に有効なセッションがある

レスポンス

PUTでは、ファイルがエクスポートしていないメソッドに対してNext.jsが返す405を確認できます。

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る