Node.jsでREST APIを構築するメリット
Node.jsはJavaScriptランタイムであり、フロントエンドエンジニアがバックエンド開発に参入しやすい環境を提供しています。Non-blockingのI/O処理モデルにより、APIサーバーとして高い同時接続性能を発揮します。
Node.jsでREST APIを作るメリット:
・JavaScript/TypeScript一本でフルスタック開発ができる
・npm/yarnのエコシステムが非常に豊富
・エコシステムが成熟しており学習リソースが豊富
・リアルタイム機能(WebSocket)との統合が容易
2025年のNode.js REST API開発では、型安全性と開発体験を重視してTypeScriptでの実装が標準になっています。本記事では、TypeScript + FastifyまたはExpressを使ったREST API構築の実践的な手順を解説します。
プロジェクト構成とディレクトリ設計
実務レベルのREST APIプロジェクトの構成を紹介します。
推奨ディレクトリ構成:
src/
├── routes/(ルーターの定義)
├── controllers/(リクエスト処理のロジック)
├── services/(ビジネスロジック)
├── repositories/(DBアクセス層)
├── models/(データモデル・型定義)
├── middlewares/(認証・ロギング等)
├── utils/(ユーティリティ関数)
├── validators/(バリデーションスキーマ)
└── config/(設定・環境変数)
この3層アーキテクチャ(Controller → Service → Repository)により、責任の分離・テスタビリティ・保守性が高まります。
ルーティング・コントローラーの実装
TypeScript + Expressでの実践的なルーティング実装パターンを解説します。
Express Router基本パターン:
usersRouter.get('/:id', async (req, res) => { ... })
usersRouter.post('/', validate(createUserSchema), async (req, res) => { ... })
usersRouter.put('/:id', auth, validate(updateUserSchema), async (req, res) => { ... })
usersRouter.delete('/:id', auth, async (req, res) => { ... })
Fastifyを使う場合のメリット:
・Expressより2〜10倍高速(ベンチマーク比)
・スキーマベースのシリアライゼーション・バリデーション(Zod/JSON Schema統合)
・TypeScript型推論が優秀
・プラグインシステムによる拡張性
認証の実装|JWT・Cookie・セッション
REST APIの認証実装の選択肢と実践的な実装方法を解説します。
JWTベースの認証フロー:
①POST /auth/login でメール・パスワード検証
②検証成功時にAccess Token(短期限)+ Refresh Token(長期限)を発行
③以降のAPIリクエストにAuthorization: Bearer [token] ヘッダーを付与
④Access Token期限切れ時にRefresh Tokenで新しいAccess Tokenを取得
JWT実装時の注意点:
・Refresh TokenはHttpOnly Cookieで保存(XSS対策)
・Access Tokenの有効期限は15分〜1時間が推奨
・本番環境ではRS256(非対称鍵)を使う
バリデーション・エラーハンドリング・ロギング
実務レベルのAPIで必須のバリデーション・エラー処理・ロギングの実装を解説します。
Zodによるバリデーション:
Zodはランタイムのバリデーションと型推論を同時に提供します。リクエストボディ・クエリパラメーター・パスパラメーターのバリデーションに使えます。バリデーションエラー時は400ステータスと分かりやすいエラーメッセージを返します。
グローバルエラーハンドリング:
Expressではerror handling middlewareを最後に追加することで、全ルートで発生したエラーを統一的に処理できます。カスタムエラークラスを使うことで、エラーの種類ごとに適切なHTTPステータスコードを返すことができます。
ロギング(Pinoの使用):
PinoはNode.js向けの高速な構造化ロガーです。JSON形式でのログ出力・リクエストID・ログレベル(error・warn・info・debug)を適切に設定することで、本番環境での問題調査が容易になります。