コース一覧
Next.jsフルスタック:サーバー・データ取得・API
Route Handler

Next.jsフルスタック:サーバー・データ取得・API

Server ComponentsとClient Components、use client、サーバーfetch、asyncコンポーネント、動的ルート、params、notFound、キャッシュ、Route Handler、GET・POST API、Server Actions、フォームを扱う全24レッスンのフルスタックコースです。fleamaの商品取得と出品機能をNext.js内へ実装します。

1
Server / Client Components
01. サーバーで動く部品10分
02. Server Components15分
03. use clientの宣言15分
04. どちらに置くか15分
05. 境界をまたぐ合成15分
06. 境界の設計15分
07. つくる - 部品の仕分け20分
08. 第4章クイズ15分
2
データ取得と動的ルート
01. サーバーでfetch15分
02. asyncコンポーネント15分
03. 動的ルート15分
04. paramsを受け取る15分
05. notFoundで404にする15分
06. キャッシュのきほん10分
07. 検索をサーバーで15分
08. つくる - サーバー取得化20分
09. 第5章クイズ15分
3
API Routesとフォーム
01. Route Handler15分
02. GET APIを作る15分
03. POST APIを作る15分
04. Server Actionsの触り15分
05. フォーム実装15分
06. つくる - 受け口の完成20分
07. 第6章クイズ15分

Route Handler

Route Handler の置き場所

API をアプリの外に置かなくてよくなる

React実践では、データを取る先が別のサーバーでした。fleama のアプリと API が別々にあって、ブラウザからそちらに取りにいく形です。

Next.js では、同じプロジェクトの中に API を置けます。これを Route Handler と呼びます。app/ の中に route.ts という名前でファイルを置くと、そのフォルダのパスがそのまま API の URL になります。

プレーンテキスト

app/api/health/route.ts -> /api/health app/api/items/route.ts -> /api/items

フォルダが URL になる決まりは、ページのときとまったく同じです。違うのはファイル名だけで、画面を返したいなら page.tsx、データを返したいなら route.ts です。同じフォルダに両方は置けません。

route.ts の中身

書くのは関数です。ただし export default ではなく、HTTP メソッドと同じ名前で名前付きに出します。GET で取り出し、POST で受け取る、というふうに分かれます。

TypeScript

import { NextResponse } from "next/server"; export async function GET() { return NextResponse.json({ status: "ok" }); }

NextResponse.json は、渡した値を JSON にして返すための道具です。next/server から import します。返し忘れるとエラーになるので、必ず return を付けます。

ページから呼ぶ

ページ側は普通の fetch です。同じアプリの中にあるので、ホスト名は要らず /api/health のような相対パスで書けます。

TypeScript (JSX)

const res = await fetch("/api/health"); const data = await res.json();

自分で書いた GET が呼ばれたかどうかは、画面に結果が出たかどうかで分かります。ここが Route Handler の気持ちのよいところです。

演習

app/api/health/route.ts に、アプリが動いていることを返す API を作ります。

ヒント

export async function GET() { ... } の形です。export default ではありません

NextResponse は next/server から import します。starter に import の行だけ書いてあります

return を付け忘れると、何も返さない API になってエラーになります

route.ts
layout.tsx
page.tsx
プレビュー

できているか

  • 確認ページが出ている
  • GET が呼ばれて status が返っている
  • app の名前も返っている
  • GET という名前で export している
  • NextResponse.json で返している
エディタを読み込んでいます