ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Express とは
Express (Express.js) は Node.js 上で動く最小主義の Web アプリケーションフレームワーク。2010 年に TJ Holowaychuk が公開し、現在は OpenJS Foundation 配下のプロジェクトです。npm で最もダウンロードされている Web フレームワークで、Node.js の Web 開発のデファクトスタンダードとなっています。
機能は「ルーティング + ミドルウェア + テンプレートエンジン連携」と最小限。ORM やバリデーション、認証は別ライブラリと組み合わせて使う設計です。
インストールと Hello World
# プロジェクト初期化
mkdir my-app && cd my-app
npm init -y
npm install express
# アプリ作成
cat > app.js <<'EOF'
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello Express!');
});
app.listen(3000, () => {
console.log('http://localhost:3000');
});
EOF
# 起動
node app.js
5 行で動作する HTTP サーバーが立ち上がります。ブラウザで http://localhost:3000 にアクセスすると "Hello Express!" が表示されます。
ルーティング
const express = require('express');
const app = express();
app.use(express.json()); // JSON body parser
// GET /users
app.get('/users', (req, res) => {
res.json([{ id: 1, name: 'Alice' }]);
});
// GET /users/:id (パスパラメータ)
app.get('/users/:id', (req, res) => {
const id = req.params.id;
res.json({ id, name: 'Alice' });
});
// POST /users (JSON body)
app.post('/users', (req, res) => {
const { name, email } = req.body;
// ... DB 保存処理
res.status(201).json({ id: 99, name, email });
});
// PUT /users/:id
app.put('/users/:id', (req, res) => {
res.json({ updated: true });
});
// DELETE /users/:id
app.delete('/users/:id', (req, res) => {
res.status(204).send();
});
// Router でグループ化
const router = express.Router();
router.get('/', (req, res) => res.send('list'));
router.get('/:id', (req, res) => res.send('detail'));
app.use('/api/posts', router);
// → /api/posts, /api/posts/:id
app.listen(3000);
ミドルウェア
Express の心臓部。リクエストが届いてからレスポンスを返すまでの処理パイプラインを構成する関数です。
const express = require('express');
const app = express();
// グローバルミドルウェア (全リクエストに適用)
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // 次のミドルウェアへ
});
// 組み込みミドルウェア
app.use(express.json()); // JSON body
app.use(express.urlencoded({ extended: true })); // form body
app.use(express.static('public')); // 静的ファイル
// 3rd party
const morgan = require('morgan');
const cors = require('cors');
app.use(morgan('combined')); // アクセスログ
app.use(cors()); // CORS 許可
// 認証ミドルウェア (個別ルートに)
function requireAuth(req, res, next) {
const token = req.headers.authorization;
if (!token) return res.status(401).json({ error: 'no token' });
// 検証...
req.user = { id: 1 };
next();
}
app.get('/me', requireAuth, (req, res) => {
res.json(req.user);
});
// エラーハンドリングミドルウェア (引数 4 つで判別される)
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: err.message });
});
req / res オブジェクト
| プロパティ/メソッド | 用途 |
|---|---|
req.params | URL パスパラメータ /users/:id の id |
req.query | クエリ文字列 ?page=2&limit=10 |
req.body | リクエストボディ (要 express.json() 等) |
req.headers | HTTP ヘッダー |
req.cookies | Cookie (要 cookie-parser) |
res.send(data) | レスポンス送信(文字列 / Buffer / オブジェクト) |
res.json(obj) | JSON で返す(Content-Type 自動設定) |
res.status(code) | ステータスコード設定(チェーン可) |
res.redirect(url) | リダイレクト |
res.sendFile(path) | ファイル送信 |
静的ファイル配信
// public/ ディレクトリの中身をそのまま配信
app.use(express.static('public'));
// → public/index.html → http://localhost:3000/
// → public/css/main.css → http://localhost:3000/css/main.css
// プレフィックス付き
app.use('/assets', express.static('public'));
// → public/logo.png → http://localhost:3000/assets/logo.png
// 複数ディレクトリ
app.use(express.static('public'));
app.use(express.static('uploads'));
Express Generator
雛形を一発生成する CLI ツール。MVC 風のディレクトリ構成が出てきます。
npx express-generator --view=pug my-app
cd my-app
npm install
DEBUG=my-app:* npm start
# 生成される構造
# my-app/
# ├── app.js
# ├── bin/www
# ├── package.json
# ├── public/
# ├── routes/
# │ ├── index.js
# │ └── users.js
# └── views/
# ├── index.pug
# └── layout.pug
エラーハンドリング
// 同期エラーは自動キャッチされる
app.get('/sync-error', (req, res) => {
throw new Error('boom'); // → エラーハンドラへ
});
// 非同期 (async) は明示的に next(err) が必要
app.get('/async-error', async (req, res, next) => {
try {
await someAsyncOp();
res.send('ok');
} catch (err) {
next(err); // ★ 重要
}
});
// Express 5 系 では async エラーも自動キャッチされる予定
// 404 ハンドラ (最後に置く)
app.use((req, res) => {
res.status(404).json({ error: 'Not Found' });
});
// エラーハンドリングミドルウェア (最後に置く)
app.use((err, req, res, next) => {
console.error(err);
res.status(err.status || 500).json({
error: err.message,
stack: process.env.NODE_ENV === 'production' ? undefined : err.stack
});
});
競合フレームワークとの比較
| フレームワーク | 特徴 | パフォーマンス | 選ぶ理由 |
|---|---|---|---|
| Express | 最小構成 / 巨大エコシステム | 標準 | 情報が一番多い・無難 |
| Fastify | 高速 / スキーマベース | Express の約 2 倍 | 性能重視 / TypeScript 親和性 |
| Koa | Express 作者の後継 / async/await ネイティブ | Express とほぼ同等 | モダンな API 設計が好み |
| NestJS | Angular 風 / DI / TS 前提 | 内部は Express or Fastify | 大規模・チーム開発 / 構造化 |
| Hono | 超軽量 / エッジ動作 | 非常に高速 | Cloudflare Workers / Bun / Deno |
FAQ
Q: Express と Next.js は競合か
A: 違います。Next.js は React のサーバーレンダリングフレームワーク、Express は汎用 Web サーバー。Next.js の API Routes が API 用途を吸収してきていますが、独立した API サーバーには Express が一般的です。
Q: Express 5 はいつ安定版になるか
A: 2024 年に正式版がリリースされました。async エラー自動キャッチや path-to-regexp の更新が主な変更点。既存 Express 4 から大半は互換です。
Q: TypeScript で使うには
A: npm install -D typescript @types/express @types/node ts-node。tsconfig.json を作って ts-node app.ts で起動できます。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?