1. 1 件あるところへ 2 件足す
  2. 空の状態から 1 件足す
  3. 足すものが無いときは初期状態のまま
コース一覧
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分

つくる:データ層

新しいことは出てきません

この回では、新しい知識は 1 つも出てきません。第2章で書いたものを 1 つにまとめて、fleama のデータ層を作ります。

データ層とは何か

データ層とは、データの出し入れだけを引き受ける場所のことです。ここまでバラバラに書いてきた「読む」「足す」「絞り込む」を、1 つのファイルにまとめます。

JavaScript

// data.js async function readItems(filePath) { /* 読む */ } async function writeItems(filePath, items) { /* 書く */ } module.exports = { readItems, writeItems };

分けておくと何がよいのか。第6章で、この中身をまるごとデータベースに差し替えます。そのとき呼び出す側は 1 行も変えずに済みます。読む・書くという約束だけが外に出ていて、それをどう実現するかは中に隠れているからです。

これが第2章で module.exports を学んだ理由です。

ここまでに手に入れたもの

何をどのレッスンで
ファイルを分けて出し入れするimport/export
ファイルを読み書きするファイルを読み書きする
待つ必要のある処理をつなぐasync/await復習
文字列とデータを行き来するJSONの取り回し

消えないことが最初の価値

第1章で作ったプロジェクトは、動かすたびに同じ初期データから始まりました。データ層ができると、出品した商品が次の起動でも残ります。

次の第3章では、いよいよサーバーが立ちます。そのサーバーが返すデータの出どころが、いま作っているこの層です。

手を動かす

演習では、読む・足す・保存するをまとめた関数を作ります。第2章のすべてが 1 つにつながります。

要件

  1. initial をファイルへ書いてから読み直し、newItems を先頭から順に末尾へ足す
  2. 足し終えた配列をファイルへ書き戻す
  3. items(全商品) count(件数) availableNames(sold が true でない商品の名前の配列) を持つオブジェクトを返す

入出力例

buildDataLayer("/tmp/fleama-layer-a.json", [{"id":1,"name":"レザースニーカー","sold":false}], [{"id":2,"name":"古着のデニムジャケット","sold":false},{"id":3,"name":"木製のスツール","sold":true}]) → {"availableNames":["レザースニーカー","古着のデニムジャケット"],"count":3,"items":[{"id":1,"name":"レザースニーカー","sold":false},{"id":2,"name":"古着のデニムジャケット","sold":false},{"id":3,"name":"木製のスツール","sold":true}]} buildDataLayer("/tmp/fleama-layer-b.json", [], [{"id":1,"name":"レザースニーカー","sold":false}]) → {"availableNames":["レザースニーカー"],"count":1,"items":[{"id":1,"name":"レザースニーカー","sold":false}]} buildDataLayer("/tmp/fleama-layer-c.json", [{"id":1,"name":"木製のスツール","sold":true}], []) → {"availableNames":[],"count":1,"items":[{"id":1,"name":"木製のスツール","sold":true}]}

ヒント

初期コードは書き込みまでで止まっています。読み直すところから続けます

追加は 1 件ずつなので、`for` で回して `push` します

`availableNames` は `filter` で売り切れを外してから `map` で名前だけにします

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

関連レッスン

  • 第2章クイズ

    モジュールと非同期処理の理解を4択で確認します。

  • サーバーとリクエスト

    待ち受けから応答までの流れをたどり、サーバーの役割を説明できるようになります。

  • RESTの考え方

    fleamaのAPI一覧表を設計し、リソースとメソッドで設計できるようになります。

  • クエリパラメータ

    キーワードとカテゴリで絞る検索APIを書き、検索条件を受け取れるようになります。

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

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

  • データベースデータを構造化して保存する仕組み
  • 処理計算や代入を表す長方形
  • async/awaitPromise を同期風に書ける糖衣構文
  • applicationJSON 本文を送るときの Content-Type
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • オブジェクトキーと値のペアで構造を作るデータ
main.js
学習モード
エディタを読み込んでいます

メモ

つくる:データ層

⌘S で保存