1. 売り切れが 1 件混ざっているとき
  2. 全部売り切れているとき
  3. 商品が無いとき
コース一覧
Node.js入門
async/await復習

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分

async/await復習

待つ必要があるもの、ないもの

前のレッスンで await fs.readFile(...) と書きました。なぜ await が要るのかを、ここで整理しておきます。

プログラムには 2 種類の処理があります。

種類例待ち方
すぐ終わる足し算、配列の絞り込み待たなくてよい
時間がかかるファイルの読み書き、通信結果を待つ必要がある

時間がかかる処理は、その場で答えを返せません。代わりに「あとで結果を渡します」という引換券を返します。これが Promise です。

await は引換券を結果に換える

JavaScript

const raw = await fs.readFile("items.json", "utf8");

await は「引換券のままではなく、中身が届くまで待つ」という指示です。付け忘れると、変数には引換券そのものが入ります。

JavaScript

const raw = fs.readFile("items.json", "utf8"); // await 忘れ JSON.parse(raw); // 中身ではなく引換券を渡している

これはエラーになりますが、種類によってはエラーにならずに変な値のまま進むこともあります。実践JavaScript で fetch に await を付け忘れたときと同じ失敗です。

await は async の中でしか書けない

await を使う関数には async を付けます。

JavaScript

async function loadItems(filePath) { const fs = require("fs/promises"); const raw = await fs.readFile(filePath, "utf8"); return JSON.parse(raw); }

そして async を付けた関数は、必ず Promise を返します。ですから呼ぶ側も await が要ります。この連鎖は、待つ必要のあるものに触れた時点から、呼び出しの流れをさかのぼって続きます。

順に待つか、まとめて待つか

複数のファイルを読むとき、書き方で速さが変わります。

JavaScript

// 順に待つ 1 つ目が終わってから 2 つ目を始める const a = await fs.readFile("a.json", "utf8"); const b = await fs.readFile("b.json", "utf8"); // まとめて待つ 2 つを同時に始めて、両方揃うのを待つ const [a2, b2] = await Promise.all([ fs.readFile("a.json", "utf8"), fs.readFile("b.json", "utf8"), ]);

互いに関係のない処理なら、Promise.all のほうが待ち時間は短くなります。前の結果を使って次を決めるなら、順に待つしかありません。

手を動かす

演習では、ファイルを読み込んでから加工して返すところまでを、非同期でつなぎます。await を置く場所を、自分で決めてください。

要件

  1. 受け取った配列を JSON の文字列にして、受け取った場所へ書き込む
  2. 同じファイルを utf8 で読み直し、JSON として解釈する
  3. sold が true でない商品の name だけを、元の並び順のまま配列で返す

入出力例

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

ヒント

まず前のレッスンと同じ形で、書き込みと読み直しを `await` でつなぎます

絞り込みは `filter` です。売り切れ **でない** ものを残すので、条件は `!item.sold` になります

名前だけの配列にするには、絞り込んだあとに `map` をつなげます

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

関連レッスン

  • JSONの取り回し

    商品追加をファイルに反映し、parseとstringifyを使い分けられるようになります。

  • つくる:データ層

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

  • 第2章クイズ

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

  • サーバーとリクエスト

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

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

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

  • 処理計算や代入を表す長方形
  • 配列サイズ固定の同型データの集まり
  • Promise非同期の結果を表すラッパーオブジェクト
  • 変数データに名前をつけて参照する仕組み
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 関数処理に名前を付けて再利用できる単位
  • 非同期完了を待たずに次へ進み、後で結果を受ける
  • 同期処理が終わるまで次に進まない実行順
main.js
学習モード
エディタを読み込んでいます

メモ

async/await復習

⌘S で保存