TypeScript 第 2 弾: zod で入力検証、JSON に永続化、Node 標準テストで守る

第 1 弾で作った Express の TODO API を、zod による入力検証(優先度・期限)、todos.json への永続化と再起動後の復元、?done= の絞り込み、Node 標準テストランナー(node:test)による自動テストで「壊れにくい API」に育てます。

中級約 75 分Azure 実環境

ラボ概要

このラボでは、社内ツールの API をチームで使える品質に引き上げる担当の想定で、入力検証・永続化・自動テストの 3 つを実装します。

ブラウザで開く IDE に、第 1 弾の完成版 TODO API(src/app.ts)と、依存パッケージ(express / zod / tsx / typescript)がインストール済みの状態で用意されています。zod でスキーマを書いて不正な入力を 400 で弾き、todos.json に保存して再起動しても消えないようにし、node:test でテストを書いて npm test で守れるようにします。

学習目標:

  • zod でスキーマ(必須・文字数・enum・既定値・書式)を定義し、ミドルウェアで検証して 400 と issues を返す
  • ファイル(JSON)への永続化と、起動時の復元・id の採番の続き
  • クエリ パラメータ(?done=true)による絞り込み
  • Node 標準のテストランナー(node:test + fetch)で API を自動テストする
  • tsc --noEmit での型チェックを開発の習慣にする
前提知識:
  • 「TypeScript で REST API を作る」ラボ相当(Express のルーティング、curl での確認)
完了条件:
  • TodoInSchema に priority(enum、既定 normal)と due(YYYY-MM-DD)があり、型チェックが通ること
  • 判定テスト(検証・既定値・絞り込み・永続化の 4 件)が合格すること(自分のテストは npm test で自己確認)
  • サーバーを起動したまま判定を実行し、/health と本文なし POST の 400 が確認できること

ラボの構成

  1. 1ブラウザ IDE を開いて土台を確認する
  2. 2TODO 1: zod スキーマに priority と due を追加する
  3. 3TODO 2: 検証ミドルウェアを実装する
  4. 4TODO 3: todos.json に永続化する
  5. 5TODO 4: ?done= で絞り込む
  6. 6テストを追加する
  7. 7判定を実行する
  8. 8発展(任意)と考察

詳細な手順は、ラボ開始後に画面内のガイドとして表示されます。

手順のプレビュー(最初のステップ)

1. ブラウザ IDE を開いて土台を確認する

  • ラボ画面の ブラウザ IDE を開く をクリックし、表示されているパスワードでサインインする
  • src/app.ts(完成版の TODO API に TODO 1〜4 が追記されたもの)、src/store.ts、src/app.test.ts を開いて全体を眺める
  • Terminal → New Terminal でターミナルを開き、まず現状で型チェックとテストが動くことを確認する
npm run typecheck
npm test
  • 2 件のテストが pass することを確認する(# pass 2)
> 注: npm test は Node 標準のテストランナー(node:test)を tsx 経由で実行します。追加のテスト フレームワークは不要です。
残り 7 セクションの手順は、ラボを開始すると画面内に表示されます

構成図

構成図

参考リソース