3秒でわかる
Node.js で Web サーバーや API を書くための軽量フレームワーク。ルーティングとミドルウェアという二つの仕組みだけを提供します。
もう少し詳しく
どういうものか
Express は Node.js 上で動く Web フレームワークです。Node.js の標準機能だけでもサーバーは書けますが、URL ごとの振り分けや JSON の読み取りを毎回自前で書くことになります。Express はそこを「ルーティング」と「ミドルウェア」という 2 つの形に整えたものです。
const express = require("express");
const app = express();
app.use(express.json());
app.get("/api/items/:id", (req, res) => {
res.json({ id: Number(req.params.id), name: "コーヒー豆" });
});
app.post("/api/items", (req, res) => {
res.status(201).json({ created: req.body });
});
app.listen(3000);なぜ必要か
Web サーバーの処理には、どのリクエストでも共通してやることがあります。ログを残す、本文を JSON として読む、ログイン済みか確かめる、といった処理です。Express はこれを関数の列として並べられるようにしました。共通処理は app.use に積み、個別の処理はルートに書く、という分け方が固定されるので、人が増えてもコードの置き場所で揉めません。
つまずきやすいところ
express.json() を書き忘れると req.body が undefined になります。POST したのに中身が空、という詰まり方の大半はこれです。
非同期処理の中で投げた例外も落とし穴です。
app.get("/api/users", async (req, res, next) => {
try {
res.json(await findUsers());
} catch (err) {
next(err); // これを忘れるとリクエストが返らない
}
});Express 4 系は async 関数の中の例外を自動では拾いません。next(err) に渡して、末尾に置いたエラーハンドラで受けます。
もうひとつ、ルートの定義順は上から評価されます。/api/items/new を /api/items/:id より後ろに書くと、new が id として読まれます。
似た用語との違い
Express は決め事が少ない分、フォルダ構成もエラー処理も自分で設計します。そこが自由さでもあり、最初の迷いどころでもあります。