コース一覧
Next.jsフルスタック:サーバー・データ取得・API
つくる - 受け口の完成

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分

つくる - 受け口の完成

受け口を2本そろえる

この章で作ってきたものを、fleama の形にまとめます。問い合わせの受け口は前のレッスンで通しました。残っているのは出品です。

出品は問い合わせより一段むずかしくなります。受け取って終わりではなく、受け取ったものを一覧に足して、その一覧をもう一度画面に出すところまでが1往復だからです。

受け取ってから返すまで

出品の POST がやることは4つです。

  1. 送られてきた中身を読む
  2. 足りないものが無いか確かめる
  3. 問題なければ一覧に足す
  4. 出来上がったものを返す

確かめるところは、問い合わせより細かくなります。商品名は空でないこと、価格は1円以上であること、の2つを別々に見て、それぞれ違う文で断ります。まとめて「入力が不正です」と返すと、送った人はどこを直せばよいのか分かりません。

TypeScript

if (!body.title) { return NextResponse.json({ error: "商品名は必須です" }, { status: 400 }); } if (!body.price || body.price <= 0) { return NextResponse.json({ error: "価格は1円以上にしてください" }, { status: 400 }); }

作れたときは、作ったものそのものを返します。id はサーバー側で決めるので、送った側は返事を見て初めて id を知ります。作成が成功したことを表す状態コードは 201 です。

送ったあとに一覧を取り直す

ページ側は、出品が成功したら一覧をもう一度取りにいきます。自分の手元の配列に足すやり方もありますが、取り直すほうが確実です。サーバーが id や並び順をどう決めたかを、そのまま画面に映せます。

TypeScript (JSX)

setMessage(data.title + " を出品しました"); await loadItems();

これで、フォームから送ったものが一覧に増えます。ブラウザとサーバーの間を1往復して戻ってくる、いちばん基本の形が通りました。

演習

出品の受け口と、出品フォームの送信処理を書きます。

ヒント

id はサーバー側で決めます。String(ITEMS.length + 1) で足ります

価格は文字で届くので、送る側で Number(form.get("price")) にしておきます

断られたときは res.ok が false になります。data.error をそのまま message に出します

成功したときの文は data.title + " を出品しました" です

loadItems は starter に書いてあるので、await で呼ぶだけです

app/api/contact/route.ts
app/api/items/route.ts
layout.tsx
page.tsx
プレビュー

できているか

  • GET で一覧が出ている
  • 商品名が空だと断られる
  • 価格が0だと断られる
  • そろっていれば出品できて一覧に増える
  • 出品の受け口を書いている
  • 作れたことを 201 で返している
  • 既定の送信を止めている
エディタを読み込んでいます