つくる:検索API完成
新しいことは出てきません
この回では、新しい知識は 1 つも出てきません。第5章で書いたものを 1 つにまとめて、fleama の検索を仕上げます。
受け取り方の全体像
第5章で、リクエストから値を受け取る道が出そろいました。
| どこから | 読み方 | 使う場面 |
|---|---|---|
| パス | req.params | どのリソースか |
| クエリ | req.query | どう絞り込むか |
| 本文 | req.body | 何を登録・更新するか |
どれも文字列で届くという点は共通です。req.body だけは express.json() を通しているので、数値は数値のまま届きます。
順番が決まっている
検索の処理には、自然な順番があります。
プレーンテキスト
絞り込む → 並べ替える → 切り出すこの順でないと結果が変わります。切り出してから絞り込むと、2 ページ目に表示される件数が足りなくなります。範囲を狭めるのは最後です。
守りの層が2つ付いた
第4章までの API は、素直な入力しか想定していませんでした。第5章で 2 つの層が付きます。
- 入力検証 — おかしな入力を 400 で弾く
- エラー用ミドルウェア — 想定外の失敗を 500 で受け止める
1 つ目は予想できる失敗、2 つ目は予想できない失敗の受け皿です。この 2 つがあると、API は簡単には落ちなくなります。
ここまでに手に入れたもの
| 何を | どのレッスンで |
|---|---|
| 条件をクエリで受け取る | クエリパラメータ |
| 並べ替えとページング | 並び替えとページング |
| 必須・型・範囲を確かめる | 入力検証 |
| 共通処理を手前にまとめる | ミドルウェア |
| 最後の受け皿を置く | エラーハンドリング |
手を動かす
演習では、第5章のすべてを備えた検索 API を組み立てます。絞り込み・並べ替え・切り出しの順番に気をつけてください。
要件
GET /itemsは 絞り込む → 並べ替える → 切り出す の順に処理するPOST /itemsはname必須とpriceの型を確かめ、通れば「最大の id + 1」で 201 を返す- すべてのルートより後にエラー用ミドルウェアを置き、500 で
{"error":"サーバーで問題が起きました"}を返す
入出力例
request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"ランニングスニーカー","price":3200}]"
request("GET", "/items?keyword=スニーカー&sort=price") → "200 [{"id":2,"name":"ランニングスニーカー","price":3200},{"id":1,"name":"レザースニーカー","price":4800}]"
request("GET", "/items?keyword=スニーカー&limit=1&offset=1") → "200 [{"id":2,"name":"ランニングスニーカー","price":3200}]"
request("POST", "/items", {"name":"木製のスツール","price":3500}) → "201 {"id":4,"name":"木製のスツール","price":3500}"
request("POST", "/items", {"name":"","price":3500}) → "400 {"error":"商品名は必須です"}"
request("POST", "/items", {"name":"木製のスツール","price":"3500"}) → "400 {"error":"価格は数値で指定してください"}"
request("GET", "/boom") → "500 {"error":"サーバーで問題が起きました"}"ヒント
編集 ゆめさく編集部