1. 空の状態へ 1 件目を足す
  2. すでに 1 件あるところへ足すと前の商品が残る
  3. すでに 2 件あるところへ足す
コース一覧
Node.js入門
JSONの取り回し

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分

JSONの取り回し

ファイルに入るのは文字だけ

ファイルに保存できるのは文字です。JavaScript の配列やオブジェクトを、そのまま置くことはできません。

そこで往復のたびに変換します。

したいこと使うもの
配列やオブジェクト → 文字列JSON.stringify
文字列 → 配列やオブジェクトJSON.parse

書くときが stringify、読むときが parse です。方向を取り違えると、文字列に対して filter を呼ぶような、意味の通らないコードになります。

読みやすく保存する

JSON.stringify は既定では 1 行にまとめます。人が開いて確かめたいファイルなら、字下げを指定できます。

JavaScript

JSON.stringify(items, null, 2);

3 つ目の 2 が字下げの幅です。2 つ目の null はここでは使いません。ファイルは少し大きくなりますが、中身を目で追えるようになります。

追加は読んでから書く

商品を 1 件足すときの流れは、前に触れたとおりです。

JavaScript

const raw = await fs.readFile(filePath, "utf8"); const items = JSON.parse(raw); items.push(newItem); await fs.writeFile(filePath, JSON.stringify(items, null, 2));

読む・足す・書き戻す、の 3 段です。読まずに書くと、それまでの商品が消えます。

壊れたファイルに備える

JSON.parse は、渡された文字列が JSON として読めないとエラーを投げます。ファイルが空だったり、書き込みの途中で止まっていたりすると起こります。

JavaScript

let items; try { items = JSON.parse(raw); } catch (error) { items = []; }

こう書いておくと、読めなかったときに空の配列から始められます。エラーで止まるか、それとも続けられる形にするかは、その場で決める設計の判断です。ここでは「商品がまだ 1 件も無い状態」として扱うのが自然です。

手を動かす

演習では、ファイルに商品を 1 件追加します。読む・足す・書き戻す、の 3 段を自分で組み立ててください。初期コードは読む手順を飛ばしているので、そこが直すところです。

要件

  1. 受け取った initial を JSON の文字列にして、受け取った場所へ書き込む
  2. 書き込んだファイルを読み直し、JSON として解釈する
  3. 読み直した配列の末尾に newItem を足し、ファイルへ書き戻したうえで、その配列を返す

入出力例

addItem("/tmp/fleama-add-a.json", [], {"id":1,"name":"レザースニーカー","price":4800}) → [{"id":1,"name":"レザースニーカー","price":4800}] addItem("/tmp/fleama-add-b.json", [{"id":1,"name":"レザースニーカー","price":4800}], {"id":2,"name":"古着のデニムジャケット","price":6200}) → [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}] addItem("/tmp/fleama-add-c.json", [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200}], {"id":3,"name":"木製のスツール","price":3500}) → [{"id":1,"name":"レザースニーカー","price":4800},{"id":2,"name":"古着のデニムジャケット","price":6200},{"id":3,"name":"木製のスツール","price":3500}]

ヒント

初期コードは 2 回目の書き込みで前の商品を消しています。2 行目を書き込みではなく読み込みに変えます

読むのは `fs.readFile(filePath, "utf8")` です。返ってくるのは文字列なので `JSON.parse` で配列に戻します

読めた配列に `push` で足してから、その配列を書き戻します

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

関連レッスン

  • つくる:データ層

    読む関数と書く関数をdata.jsに整え、ファイルベースのデータ層を作れるようになります。

  • 第2章クイズ

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

  • サーバーとリクエスト

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

  • RESTの考え方

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

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

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

  • JavaScriptWeb で動的な振る舞いを担う言語
  • 配列サイズ固定の同型データの集まり
  • オブジェクトキーと値のペアで構造を作るデータ
  • applicationJSON 本文を送るときの Content-Type
  • 設計何をどう作るかを決める前工程
  • 判断YES/NO 分岐を表す菱形
main.js
学習モード
エディタを読み込んでいます

メモ

JSONの取り回し

⌘S で保存