このユニットのゴール
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タブで往復を見る
- Networkタブを開くF12 → 「Network」タブ → そのままページを再読み込みします。
- 行列を眺めるHTML・CSS・画像など、1行 = 1往復の一覧が流れます。ページ1枚が「何十回もの往復」でできていると分かります。
- ステータスコードを読む各行の「Status」列が返事の種類です。200 = 成功、404 = 見つからない、500 = サーバー側の故障。この3つだけ覚えれば、当面は足ります。
- 404を起こしてみるURLの末尾に
/nai-pageと打って開き、Networkで404を観察します。ユニット3の住所検索も開いて、APIの行 (zipcloud) を見つけてみましょう。 - 観察メモを書く「リクエスト = 」「レスポンス = 」「404とは = 」を自分の言葉で3行にまとめます。これが越境の地図になります。
授業2: Node.js ― ブラウザの外でJSを動かす
Node.js (ノード) は、ブラウザなしでJavaScriptを動かす実行エンジンです。これがあると、JSで「サーバー」も「道具づくり」もできるようになります。
例題 (リードつき) | インストールして、最初の1行
- インストールする
nodejs.orgから「LTS」と書いてある方をダウンロードして、そのままインストールします (設定は全部そのままでOKです)。 - 確認するVS Codeのターミナル (Ctrl + @) で
node --version。数字が出れば成功です。 - ファイルを実行する
hello.jsを作ってconsole.log("ブラウザの外で動いた!");と書き、ターミナルでnode hello.js。出力がターミナルに出ます。コンソールの実験室が、パソコン全体に広がりました。 - ブラウザとの違いを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分で立てる
- プロジェクトを作る新しいフォルダ
my-apiで、ターミナルからnpm init -y npm install expressnpmはライブラリを取ってくる道具で、Node.jsと一緒に入っています。 - 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 で待機中"); }); - 起動する
node server.js。ターミナルに「待機中」と出ます。これであなたのパソコンはサーバーです。 - ブラウザで呼ぶ
http://localhost:3000/api/helloを開くと、自分のJSONが返ってきます。zipcloudと同じ景色を、自分が作りました。 - 止め方と直し方止めるのはターミナルで Ctrl + C。コードを直したら、止めてもう一度
node server.jsです。「直したのに変わらない」の原因は、ほぼ再起動忘れです。
演習 3-A (リードつき) | おみくじAPI + 画面から呼ぶ
お題: Step 3で作ったおみくじを、API化して画面から呼びます。
- 窓口を増やす
app.get("/api/omikuji", ...)を足し、「大吉・中吉・小吉・凶」からMath.random()で1つ選んでres.json({ result: ... })で返します。 - 画面を同居させる
publicフォルダを作ってindex.htmlを入れ、server.jsにapp.use(express.static("public"));を1行足します。http://localhost:3000で自分のページが開くようになります。 - fetchで呼ぶページのボタンから
fetch("/api/omikuji")→ 結果を表示。ユニット3の知識がそのまま使えます。URLが/api/…だけで済むのは、画面とAPIが同じサーバーにいるからです。
答え合わせ: ボタンを押すたびに違う運勢が出れば完成です。Networkタブを開いて、自分のAPIへの往復が記録される様子も観察しましょう。授業1の景色と完全につながります。
授業4: 受け取って保存するAPI
取る (GET) の次は、送られてきたものを受け取る (POST) です。これができると、掲示板・日報・予約など「ためるアプリ」が作れるようになります。
例題 (リードつき) | メッセージを記録するAPI
- 受け取りの準備server.jsの上の方に
app.use(express.json());を足します (送られてくるJSONを読む宣言です)。 - 受け取って、ためて、保存する
localStorageの「万能の型」と同じ発想 (stringifyでしまう・parseで出す) が、サーバー側でも主役です。保存先がブラウザからファイル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); });messages.jsonに変わっただけです。 - 画面から送るフロント側のfetchは、送るときだけ少し長くなります。
await fetch("/api/messages", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: input.value }) }); - 確かめる送信 →
messages.jsonをVS Codeで開いて、増えていることを確認します。サーバーを再起動しても残っていれば、保存は本物です。
月末制作: ひとこと掲示板
月末制作
このユニットの全部品を組み立てて、事業所内で使える「ひとこと掲示板」を完成させます。
- 機能: ①名前とひとことを投稿できる ②一覧が新しい順に表示される ③空の投稿はエラーメッセージで弾く ④投稿後に入力欄が空になる、の4つです。
- 作る順番: API (GET → POST) をブラウザとNetworkタブで確かめてから、画面を作ります。裏から表へが、つなぎこみで迷子にならない順番です。
- 品質: ユニット4で学んだこと (ラベルつきフォーム・読み込み中表示・try / catch) を、自分のAPI相手にも適用します。
- デモ発表: スタッフに投稿してもらい、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側からどう作るか見比べてみましょう。言語が違っても、リクエストとレスポンスの骨格は同じだと分かります。