Express.js完全ガイド:初心者が知るべきすべて【2026年版】
はじめに
Web開発の世界に足を踏み入れると、必ず耳にするのが**「Express.js」**という名前です。Node.jsでWebアプリケーションやAPIを構築する際、Express.jsは圧倒的なシェアを誇り、世界中の開発者に愛用されています。
しかし、初めて学ぶ方にとっては「どこから始めればいいのか」「他のフレームワークと何が違うのか」といった疑問が湧いてくるでしょう。この記事では、プログラミング初心者の方でも理解できるよう、Express.jsの基礎から実践的な使い方まで、丁寧に解説していきます。コード例には詳しい説明を加え、なぜそのように書くのか、何が起こっているのかを明確にします。また、Koa、Fastify、NestJSといった他のフレームワークとの比較も行い、あなたのプロジェクトに最適な選択ができるようサポートします。
Express.jsとは何か?
Express.jsは、Node.js上で動作する軽量で柔軟性の高いWebアプリケーションフレームワークです。2010年にTJ Holowaychukによって開発され、現在はNode.js Foundationの支援のもと、オープンソースプロジェクトとして活発に開発が続けられています。npmのダウンロード数は週に数千万回にのぼり、Node.jsエコシステムにおいて最も信頼されているフレームワークの一つです。
Express.jsの特徴と魅力
Express.jsが多くの開発者に選ばれる理由は、その設計思想にあります。
- シンプルさと直感性: 複雑な設定ファイルや難解な概念を学ぶ必要はなく、JavaScriptの基礎知識があれば、すぐに実用的なアプリケーションを作り始められます。わずか数行のコードでWebサーバーを立ち上げることが可能です。
- ミドルウェアアーキテクチャ: 機能を小さな部品(ミドルウェア)として組み合わせていく独特の設計パターンを採用しています。必要な機能(ログ、認証など)だけを選んで組み込むことができ、小規模なプロトタイプから大規模なエンタープライズアプリケーションまで対応可能です。
- 豊富なエコシステム: 認証、データベース接続、セッション管理、ファイルアップロードなど、ありとあらゆる機能に対応したサードパーティ製ミドルウェアが存在します。既存の優れたツールを活用することで、開発スピードを大幅に向上させることができます。
- HTTPメソッドの完全サポート: GET、POST、PUT、DELETE、PATCHといった各種HTTPメソッドに対応したルーティング機能が用意されており、RESTful APIの構築が非常に簡単です。
開発環境の構築
Node.jsのインストール
Express.jsはNode.js上で動作するため、まずNode.jsをインストールする必要があります。Node.js公式サイトにアクセスし、LTS(Long Term Support)版をダウンロードしてインストールしてください。
インストール完了後、ターミナルで以下のコマンドを実行し、バージョンが表示されれば成功です。
Bash
node --version
npm --version
Note:
npmは Node Package Manager の略で、パッケージ(ライブラリやフレームワーク)を管理する必須ツールです。
プロジェクトの初期化とExpressのインストール
新しいプロジェクトを作成します。
Bash
mkdir my-express-app
cd my-express-app
npm init -y
npm install express
npm init -y: プロジェクト情報や依存関係を記録するpackage.jsonをデフォルト設定で作成します。npm install express:node_modulesディレクトリに本体を保存し、package.jsonに依存関係を追記します。
最初のExpressアプリケーション - Hello World
最もシンプルなWebサーバーを作成してみましょう。app.js を作成し、以下のコードを記述します。
JavaScript
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`サーバーが起動しました: http://localhost:${port}`);
});
コードの解説
const express = require('express');: インストールしたExpressモジュールを読み込み、定数に格納します。const app = express();: インスタンスを作成します。このappオブジェクトがサーバー設定の中心となります。const port = 3000;: 待ち受けポート番号を定義します。- ルーティングの定義:
app.get('/', ...): ルート(トップページ)へのGETリクエストを処理します。req(request): クライアントからの情報。res(response): クライアントへの返答用メソッド。res.send(...): テキストを送信します。
- サーバーの起動:
app.listen()で指定ポートでリクエストの待機を開始します。
起動コマンド:
Bash
node app.js
ブラウザで http://localhost:3000 にアクセスして確認してください。停止は Ctrl + C です。
ルーティング - リクエストを適切に処理する
ルーティングは、ユーザーのURLやHTTPメソッドに応じて、適切な処理を実行する仕組みです。
HTTPメソッドの種類
| メソッド | 役割 |
| GET | データの取得(ブラウザでのURLアクセスなど) |
| POST | データの新規作成(フォーム送信など) |
| PUT | データの更新(全体的な置き換え) |
| PATCH | データの部分的な更新 |
| DELETE | データの削除 |
Google スプレッドシートにエクスポート
基本的なルーティングの実装例 (CRUD操作)
JavaScript
app.use(express.json()); // JSONパース用ミドルウェア
// GET: ユーザー一覧取得
app.get('/users', (req, res) => {
const users = [
{ id: 1, name: '山田太郎', email: 'yamada@example.com' },
{ id: 2, name: '佐藤花子', email: 'sato@example.com' }
];
res.json(users);
});
// POST: 新規作成
app.post('/users', (req, res) => {
const newUser = {
id: 3,
name: req.body.name,
email: req.body.email
};
res.status(201).json(newUser); // 201: Created
});
// PUT: ユーザー更新
app.put('/users/:id', (req, res) => {
const userId = req.params.id; // ルートパラメータを取得
const updatedUser = { id: userId, name: req.body.name, email: req.body.email };
res.json({ message: `ユーザー${userId}を更新しました`, user: updatedUser });
});
// DELETE: 削除
app.delete('/users/:id', (req, res) => {
res.status(204).send(); // 204: No Content
});
ルートパラメータとクエリパラメータの違い
- ルートパラメータ (
req.params): URLパスの一部として指定。特定のリソース識別に使用(例:/users/123)。 - クエリパラメータ (
req.query): URL末尾の?以降。フィルタリングやソートに使用(例:/search?keyword=express)。
ミドルウェア - Express.jsの心臓部
ミドルウェアは、リクエストからレスポンスまでのサイクルの中で実行される関数です。next() 関数を呼び出すことで、次の処理へバトンを渡します。
ミドルウェアの仕組み
JavaScript
// 例:すべてのリクエストで実行されるロガー
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next(); // これを忘れるとリクエストが止まります
});
カスタムミドルウェアの作成例
JavaScript
// 認証ミドルウェア
const authenticateApiKey = (req, res, next) => {
const apiKey = req.headers['x-api-key'];
if (apiKey === 'my-secret-api-key-12345') {
req.user = { id: 1, name: '認証済みユーザー' };
next();
} else {
res.status(403).json({ error: 'APIキーが無効です' });
}
};
// 特定のルートにのみ適用
app.get('/protected', authenticateApiKey, (req, res) => {
res.json({ message: '保護されたデータ', user: req.user });
});
組み込み・サードパーティ製ミドルウェア
express.json(): JSONボディのパース。express.static('public'): 画像やCSSなどの静的ファイル提供。cors: クロスドメイン通信の許可。helmet: セキュリティヘッダーの設定。morgan: HTTPリクエストのログ出力。
エラーハンドリング - 問題に適切に対処する
404エラー(ページが見つからない)
全てのルート定義の後に配置します。
JavaScript
app.use((req, res) => {
res.status(404).json({ error: 'ページが見つかりません', url: req.url });
});
共通エラーハンドラー
4つの引数 (err, req, res, next) を持つのが特徴です。
JavaScript
app.use((err, req, res, next) => {
console.error(err.stack);
const isDev = process.env.NODE_ENV === 'development';
res.status(err.status || 500).json({
error: 'サーバーエラー',
message: isDev ? err.message : '内部エラーが発生しました',
...(isDev && { stack: err.stack })
});
});
非同期処理のエラーハンドリング
async/await を使う場合は try-catch で囲み、next(error) を呼ぶ必要があります。
JavaScript
// ヘルパー関数で簡略化
const asyncHandler = (fn) => (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next);
};
app.get('/users/:id', asyncHandler(async (req, res) => {
const user = await User.findById(req.params.id);
if (!user) throw new Error('ユーザーが見つかりません');
res.json(user);
}));
テンプレートエンジン - 動的なHTMLを生成する
APIだけでなく、サーバー側でHTMLを組み立てる際に「EJS」などのテンプレートエンジンを使用します。
EJS(Embedded JavaScript)の利用
Bash
npm install ejs
app.jsの設定:
JavaScript
app.set('view engine', 'ejs');
app.set('views', './views');
app.get('/profile/:username', (req, res) => {
const userData = { name: '山田太郎', hobbies: ['読書', '旅行'] };
res.render('profile', { user: userData }); // views/profile.ejsをレンダリング
});
views/profile.ejsの例:
HTML
<h1><%= user.name %>のプロフィール</h1>
<ul>
<% user.hobbies.forEach(function(hobby) { %>
<li><%= hobby %></li>
<% }); %>
</ul>
<%= ... %>: エスケープして出力。<% ... %>: JavaScriptのロジック実行。
データベース連携 - 永続的なデータ保存
実用的なアプリにはデータベースが不可欠です。
1. MongoDB と Mongoose (NoSQL)
JSONライクなドキュメント型DBです。
JavaScript
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/myapp');
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, unique: true },
createdAt: { type: Date, default: Date.now }
});
const User = mongoose.model('User', userSchema);
2. MySQL と Sequelize (SQL)
リレーショナルデータベース(RDB)です。
JavaScript
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', { dialect: 'mysql' });
const User = sequelize.define('User', {
name: { type: DataTypes.STRING, allowNull: false },
email: { type: DataTypes.STRING, unique: true }
}, { underscored: true });
まとめ
Express.jsは、そのシンプルさと強力な拡張性により、2026年においてもNode.js開発の第一選択肢であり続けています。基礎となる「ルーティング」「ミドルウェア」「エラーハンドリング」をマスターすれば、どんな複雑なアプリケーションでも構築できるようになります。
まずは、小さなAPIから作り始めてみてください。実際に手を動かすことが、上達への一番の近道です。
