プロへの道 » フロントエンドコース » ユニット5

フロントエンドコース ユニット5 (越境) | 目安: 120時間 (約1.5ヶ月)

サーバーに馴染む ― fetchの向こう側へ

ユニット3で、あなたはAPIを「呼ぶ側」になりました。このユニットでは越境して「作る側」を体験します。向こう側の事情が分かるフロントエンドは、バックエンド担当との会話がかみ合い、エラーの原因切り分けも段違いに速くなります。

このユニットのゴール Node.jsとExpressで小さなAPIを自作し、自分のフロントエンドからfetchで呼んで、画面とサーバーの往復を一人で組めるようになる。

進め方の地図

やること 仕上がるもの
1週目 授業1: サーバーの正体を観察する Networkタブの観察メモ
2週目 授業2: Node.js入門 パソコンの上で動く最初のJS
3〜4週目 授業3: Expressで自分のAPIを立てる 挨拶API + おみくじAPI
5週目 授業4: 受け取って保存するAPI メッセージを記録するAPI
6週目 月末制作: ひとこと掲示板 自作API + 画面の完成品
怖がらなくて大丈夫です。サーバーで書く言語も、同じJavaScriptです。新しく覚えるのは「動かす場所がブラウザからパソコン本体に変わる」という1点だけ。ユニット2で鍛えた基礎が、そのまま通用します。

授業1: サーバーの正体 ― まず観察する

Webの会話は、たった1往復です。ブラウザが「これください」(リクエスト) と言い、サーバーが「どうぞ」(レスポンス) と返す。この往復は、開発者ツールで全部見えます。

例題 (リードつき) | Networkタブで往復を見る
  1. Networkタブを開くF12 → 「Network」タブ → そのままページを再読み込みします。
  2. 行列を眺めるHTML・CSS・画像など、1行 = 1往復の一覧が流れます。ページ1枚が「何十回もの往復」でできていると分かります。
  3. ステータスコードを読む各行の「Status」列が返事の種類です。200 = 成功、404 = 見つからない、500 = サーバー側の故障。この3つだけ覚えれば、当面は足ります。
  4. 404を起こしてみるURLの末尾に /nai-page と打って開き、Networkで404を観察します。ユニット3の住所検索も開いて、APIの行 (zipcloud) を見つけてみましょう。
  5. 観察メモを書く「リクエスト = 」「レスポンス = 」「404とは = 」を自分の言葉で3行にまとめます。これが越境の地図になります。

授業2: Node.js ― ブラウザの外でJSを動かす

Node.js (ノード) は、ブラウザなしでJavaScriptを動かす実行エンジンです。これがあると、JSで「サーバー」も「道具づくり」もできるようになります。

例題 (リードつき) | インストールして、最初の1行
  1. インストールするnodejs.org から「LTS」と書いてある方をダウンロードして、そのままインストールします (設定は全部そのままでOKです)。
  2. 確認するVS Codeのターミナル (Ctrl + @) で node --version。数字が出れば成功です。
  3. ファイルを実行するhello.js を作って console.log("ブラウザの外で動いた!"); と書き、ターミナルで node hello.js。出力がターミナルに出ます。コンソールの実験室が、パソコン全体に広がりました。
  4. ブラウザとの違いを1つ確かめるdocument.title を実行するとエラーになります。Node.jsには「画面 (document)」がないからです。逆にNode.jsにはファイル操作など、ブラウザにない力があります。
演習 2-A (ヒントだけ) | 学習記録の1行ツール

お題: node kiroku.js 今日はNodeに入門した と打つと、日時つきの1行をターミナルに表示する小さな道具を作ります。

ヒント: コマンドの後ろの言葉は process.argv[2] で受け取れます。日時は new Date().toLocaleString() です。「自分専用の道具を作る」感覚が、バックエンドの楽しさの入り口です。

授業3: Expressで自分のAPIを立てる

Express (エクスプレス) は、Node.jsでサーバーを作るための定番ライブラリです。「このURLに来たら、これを返す」を1行ずつ書いていくだけで、あなた専用のAPIができます。

例題 (リードつき) | 挨拶APIを30分で立てる
  1. プロジェクトを作る新しいフォルダ my-api で、ターミナルから
    npm init -y
    npm install express
    npm はライブラリを取ってくる道具で、Node.jsと一緒に入っています。
  2. server.jsを書く
    const express = require("express");
    const app = express();
    
    app.get("/api/hello", (req, res) => {
      res.json({ message: "こんにちは、私のAPIです!" });
    });
    
    app.listen(3000, () => {
      console.log("http://localhost:3000 で待機中");
    });
  3. 起動するnode server.js。ターミナルに「待機中」と出ます。これであなたのパソコンはサーバーです。
  4. ブラウザで呼ぶhttp://localhost:3000/api/hello を開くと、自分のJSONが返ってきます。zipcloudと同じ景色を、自分が作りました。
  5. 止め方と直し方止めるのはターミナルで Ctrl + C。コードを直したら、止めてもう一度 node server.js です。「直したのに変わらない」の原因は、ほぼ再起動忘れです。
演習 3-A (リードつき) | おみくじAPI + 画面から呼ぶ

お題: Step 3で作ったおみくじを、API化して画面から呼びます。

  1. 窓口を増やすapp.get("/api/omikuji", ...) を足し、「大吉・中吉・小吉・凶」から Math.random() で1つ選んで res.json({ result: ... }) で返します。
  2. 画面を同居させるpublic フォルダを作って index.html を入れ、server.jsに app.use(express.static("public")); を1行足します。http://localhost:3000 で自分のページが開くようになります。
  3. fetchで呼ぶページのボタンから fetch("/api/omikuji") → 結果を表示。ユニット3の知識がそのまま使えます。URLが /api/… だけで済むのは、画面とAPIが同じサーバーにいるからです。
答え合わせ: ボタンを押すたびに違う運勢が出れば完成です。Networkタブを開いて、自分のAPIへの往復が記録される様子も観察しましょう。授業1の景色と完全につながります。

授業4: 受け取って保存するAPI

取る (GET) の次は、送られてきたものを受け取る (POST) です。これができると、掲示板・日報・予約など「ためるアプリ」が作れるようになります。

例題 (リードつき) | メッセージを記録するAPI
  1. 受け取りの準備server.jsの上の方に app.use(express.json()); を足します (送られてくるJSONを読む宣言です)。
  2. 受け取って、ためて、保存する
    const fs = require("fs");
    let messages = [];
    try {
      messages = JSON.parse(fs.readFileSync("messages.json", "utf8"));
    } catch (e) {}
    
    app.post("/api/messages", (req, res) => {
      messages.push({ text: req.body.text });
      fs.writeFileSync("messages.json", JSON.stringify(messages, null, 2));
      res.json({ ok: true });
    });
    
    app.get("/api/messages", (req, res) => {
      res.json(messages);
    });
    localStorageの「万能の型」と同じ発想 (stringifyでしまう・parseで出す) が、サーバー側でも主役です。保存先がブラウザからファイル messages.json に変わっただけです。
  3. 画面から送るフロント側のfetchは、送るときだけ少し長くなります。
    await fetch("/api/messages", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ text: input.value })
    });
  4. 確かめる送信 → messages.json をVS Codeで開いて、増えていることを確認します。サーバーを再起動しても残っていれば、保存は本物です。

月末制作: ひとこと掲示板

月末制作

このユニットの全部品を組み立てて、事業所内で使える「ひとこと掲示板」を完成させます。

  1. 機能: ①名前とひとことを投稿できる ②一覧が新しい順に表示される ③空の投稿はエラーメッセージで弾く ④投稿後に入力欄が空になる、の4つです。
  2. 作る順番: API (GET → POST) をブラウザとNetworkタブで確かめてから、画面を作ります。裏から表へが、つなぎこみで迷子にならない順番です。
  3. 品質: ユニット4で学んだこと (ラベルつきフォーム・読み込み中表示・try / catch) を、自分のAPI相手にも適用します。
  4. デモ発表: スタッフに投稿してもらい、messages.jsonが育っていく様子まで見せて、仕組みを自分の言葉で説明します。
公開についての大事な知識: GitHub Pagesに置けるのは「静的な (サーバーなしの) ページ」だけなので、この掲示板はそのままでは公開できません。コードはGitHubに上げ、動かすのは手元 (localhost)、が今回の正解です。「動かし続けるには、サーバーを貸してくれるサービスが要る」― この実感こそが、越境ユニットの一番のお土産です。

つまずきやすいポイント

「localhostって何?」と混乱したら: 「自分のパソコン自身」を指す特別な住所です。localhost:3000 は「自分のパソコンの3000番窓口」の意味で、インターネットには出ていません。だから安心して実験できます。
ポートが使用中というエラーが出たら: 前のサーバーが止まっていません。前のターミナルで Ctrl + C を押すか、ターミナルごと閉じてから起動し直しましょう。全員が一度はやる、通過儀礼のエラーです。

発展チャレンジ (余力のある方へ)

発展チャレンジ
  • 掲示板に「削除ボタン」を足してみましょう (app.delete(...) と、fetchの method: "DELETE" を調べることになります)。
  • 無料でNode.jsを動かせるサービス (RenderやGlitchなど) を調べて、掲示板を本当に公開する手順を読んでみましょう (実行は任意です)。
  • バックエンドコースのユニット4 (pb-04) をのぞいて、同じ「Webアプリ」をPython側からどう作るか見比べてみましょう。言語が違っても、リクエストとレスポンスの骨格は同じだと分かります。

できたチェック