こんにちは、任意団体easteで代表をやっています、@kocho5252です。
今回は、Node.js + ExpressでAPIサーバを運用している方向けに、
「混沌としたAPIサーバを整理して堅牢に保つ7つの戦術」をまとめてみました。
1. ルーティングを整理する
APIが複雑になってくると、ルート定義だけで混乱しがちです。
そこで、ルーティングごとにファイルを分割して、コントローラーと明確に分けることをおすすめします。
// routes/users.js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
router.get('/', userController.getAllUsers);
router.post('/', userController.createUser);
module.exports = router;
2. コントローラーでロジックを分離
ルーティングは「入口」を管理するだけにして、処理はコントローラーでまとめます。
こうすることで再利用性が上がり、テストもやりやすくなります。
// controllers/userController.js
exports.getAllUsers = async (req, res, next) => {
try {
const users = await User.find();
res.json(users);
} catch (err) {
next(err);
}
};
3. ミドルウェアで共通処理をまとめる
ログ、認証、CORSなどの共通処理はミドルウェアで統一すると便利です。
app.use(require('cors')());
app.use(require('morgan')('dev'));
app.use(express.json());
4. エラーハンドリングを統一
例外処理を集中管理することで、予期せぬクラッシュを防ぎます。
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: err.message });
});
5. 環境変数で設定を管理
DB接続やポート番号などの設定は、環境変数で管理しましょう。
ハードコーディングは避けるのが基本です。
PORT=3000
DB_URL=mongodb://localhost:27017/mydb
require('dotenv').config();
const port = process.env.PORT || 3000;
6. テストで品質を担保
JestやSupertestを使ってAPIの挙動をチェックすると、安心してデプロイできます。
const request = require('supertest');
const app = require('../app');
test('GET /users returns 200', async () => {
const res = await request(app).get('/users');
expect(res.statusCode).toBe(200);
});
7. ログと監視で運用を安定させる
WinstonやPinoでログを管理し、PM2やDockerでプロセスを監視するのがおすすめです。
const winston = require('winston');
const logger = winston.createLogger({
transports: [new winston.transports.Console()]
});
まとめ
- ルーティング・コントローラー・ミドルウェアを整理する
- エラーハンドリングと環境変数で柔軟性を確保
- テスト・ログ・監視で運用を安定させる
まずは1つずつ戦術を取り入れて、APIサーバの混沌を制覇しましょう。
この記事が少しでも参考になればうれしいです。
任意団体easteとして、今後もこうした「開発・運用の整理」に役立つTipsを発信していきます。