1. 既定は先頭から2件
  2. 価格の安い順に2件
  3. 3件目から1件
  4. limit を増やせば全件
  5. 並べ替えても元の並びは壊れない
コース一覧
Node.js入門
並び替えとページング

Node.js入門

Node.jsの実行モデル、npm、Expressによるルーティング、REST API設計、データベース接続、トランザクションを使った購入処理、トークン認証まで、バックエンド開発の基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIを自分の手で作りながら学びます。

1
Node.jsとは
01. Node.jsとは15分
02. スクリプトを実行する15分
03. npmとは15分
04. package.json15分
05. npmスクリプト15分
06. つくる:プロジェクト始動20分
07. 第1章クイズ10分
2
モジュールと非同期の復習
01. import/export15分
02. ファイルを読み書きする15分
03. async/await復習15分
04. JSONの取り回し15分
05. つくる:データ層20分
06. 第2章クイズ10分
3
はじめてのサーバー
01. サーバーとリクエスト15分
02. Expressを導入する15分
03. ルーティング15分
04. JSONを返す15分
05. 開発の回し方15分
06. つくる:サーバー始動20分
07. 第3章クイズ10分
4
REST APIのきほん
01. RESTの考え方15分
02. 一覧を返す15分
03. 1件を返す15分
04. 登録を受ける15分
05. 更新と削除15分
06. ステータスコード15分
07. つくる:商品CRUD完成20分
08. 第4章クイズ10分
5
リクエスト処理と検証
01. クエリパラメータ15分
02. 並び替えとページング15分
03. 入力検証15分
04. ミドルウェア15分
05. エラーハンドリング15分
06. つくる:検索API完成20分
07. 第5章クイズ10分
6
データベース接続
01. DBにつなぐ15分
02. 一覧・詳細をDB化15分
03. 出品をDB化15分
04. SQLインジェクション20分
05. 更新・削除をDB化15分
06. 購入トランザクション20分
07. つくる:DB版fleama20分
08. 第6章クイズ10分
7
認証のきほん
01. 認証と認可15分
02. パスワードハッシュ15分
03. ログインとトークン15分
04. 保護ルート15分
05. 本人のものだけ15分
06. つくる:認証完備20分
07. 第7章クイズ10分
8
総合制作
01. fleama API完成20分
02. Reactと接続する20分
03. サーバーで常駐させる20分
04. 自由拡張20分
05. 完成と次のステップ15分

並び替えとページング

全部返すと重くなる

商品が 10 件なら全部返して構いません。10 万件になったらそうはいきません。返すのに時間がかかり、受け取る側も全部は表示しません。

そこで一覧の API には、たいてい 2 つの機能が付きます。

機能何をするか
並び替えどの順に返すか
ページング何件目から何件返すか

どちらもクエリで指定します。前のレッスンの絞り込みと同じ考え方です。

並び替え

プレーンテキスト

/items?sort=price

受け取った側は、その項目で並べ替えて返します。

JavaScript

if (sort === "price") { found = found.sort((a, b) => a.price - b.price); }

sort に渡す関数は、2 つを比べて「前に出すなら負の数」を返す約束です。a.price - b.price なら安い順、b.price - a.price なら高い順になります。

sort は元の配列を書き換える

注意すべき点があります。sort は新しい配列を作らず、元の配列そのものを並べ替えます。

JavaScript

items.sort((a, b) => a.price - b.price); // items 自体が変わる

これをすると、次のリクエストでは並びが変わったままの items が使われます。元を残したいときは、先に写しを作ります。

JavaScript

const sorted = [...items].sort((a, b) => a.price - b.price);

filter や map は新しい配列を返すので、この心配はありません。sort だけが例外だと覚えてください。

ページング

プレーンテキスト

/items?limit=2&offset=2

offset が「何件飛ばすか」、limit が「何件返すか」です。3 件目から 2 件、という指定になります。

JavaScript

const limit = Number(req.query.limit) || 10; const offset = Number(req.query.offset) || 0; found = found.slice(offset, offset + limit);

slice は開始位置と終了位置を取るので、終わりは offset + limit になります。

既定値を決めておくのが大切です。指定が無いときに全件返してしまっては、ページングを付けた意味がありません。

手を動かす

演習では、並び替えとページングを備えた一覧 API を作ります。元の配列を壊さないように書いてください。

要件

  1. sort=price は価格の安い順、sort=name は名前の昇順に並べ替える
  2. limit(既定 2)と offset(既定 0)で切り出す
  3. 並べ替えで元の items を書き換えない

入出力例

request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}]" request("GET", "/items?sort=price") → "200 [{"id":3,"name":"木製のスツール","price":3500},{"id":1,"name":"レザースニーカー","price":4800}]" request("GET", "/items?limit=1&offset=2") → "200 [{"id":3,"name":"木製のスツール","price":3500}]" request("GET", "/items?limit=10") → "200 [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200},{"id":3,"name":"木製のスツール","price":3500}]" request("GET", "/items?limit=3") → "200 [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200},{"id":3,"name":"木製のスツール","price":3500}]"

ヒント

まず `[...items]` で写しを作ります。ここを飛ばすと元の並びが壊れます

`limit` と `offset` は文字列で届くので `Number(...)` で直し、`||` で既定値に落とします

切り出しは `found.slice(offset, offset + limit)` です

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • 入力検証

    価格が数値かとタイトル必須を確かめ、不正な出品を弾けるようになります。

  • ミドルウェア

    ログ出力ミドルウェアを自作し、共通処理を挟めるようになります。

  • エラーハンドリング

    共通エラー処理で500を整形し、落ちないAPIにできるようになります。

  • つくる:検索API完成

    検索と検証を備え、フリマらしい絞り込みを完成できるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
main.js
学習モード
エディタを読み込んでいます

メモ

並び替えとページング

⌘S で保存