サードパーティライブラリを使用して Express でルートハンドラーを自動的にロードする方法
Node.js と Express で複数のファイルにルートハンドラーを含める方法
require() を使用
これは、ルートハンドラーを含むファイルを個別に require()
する最も単純な方法です。 以下は例です。
// app.js
const express = require('express');
const app = express();
// ファイル `./routes/users.js` からルートハンドラーをインポート
const usersRouter = require('./routes/users');
// `/users` プレフィックスを持つすべてのルートを usersRouter にルーティング
app.use('/users', usersRouter);
// ファイル `./routes/posts.js` からルートハンドラーをインポート
const postsRouter = require('./routes/posts');
// `/posts` プレフィックスを持つすべてのルートを postsRouter にルーティング
app.use('/posts', postsRouter);
app.listen(3000);
この方法の利点は、シンプルで理解しやすいことです。 ただし、アプリケーションが大きくなると、コードが散らかって見づらくなる可能性があります。
express.Router()
を使用して、個別のモジュールとしてルートハンドラーを整理できます。 以下は例です。
// ./routes/users.js
const express = require('express');
const router = express.Router();
// ユーザー関連のルートハンドラーを定義
router.get('/', (req, res) => {
res.send('ユーザー一覧');
});
router.get('/:id', (req, res) => {
res.send(`ユーザー ID: ${req.params.id}`);
});
module.exports = router;
// ./routes/posts.js
const express = require('express');
const router = express.Router();
// 投稿関連のルートハンドラーを定義
router.get('/', (req, res) => {
res.send('投稿一覧');
});
router.get('/:id', (req, res) => {
res.send(`投稿 ID: ${req.params.id}`);
});
module.exports = router;
// app.js
const express = require('express');
const app = express();
// `/users` プレフィックスを持つすべてのルートを usersRouter にルーティング
app.use('/users', require('./routes/users'));
// `/posts` プレフィックスを持つすべてのルートを postsRouter にルーティング
app.use('/posts', require('./routes/posts'));
app.listen(3000);
この方法の利点は、コードをよりモジュール化して整理できることです。
ミドルウェアを使用して、ルートハンドラーを個別のファイルに分割できます。 以下は例です。
// ./middleware/auth.js
const auth = (req, res, next) => {
// ユーザー認証ロジック
if (!req.isAuthenticated()) {
return res.sendStatus(401);
}
next();
};
// ./routes/users.js
const express = require('express');
const router = express.Router();
// 認証ミドルウェアを使用
router.use(auth);
// ユーザー関連のルートハンドラーを定義
router.get('/', (req, res) => {
res.send('ユーザー一覧');
});
router.get('/:id', (req, res) => {
res.send(`ユーザー ID: ${req.params.id}`);
});
module.exports = router;
// ./app.js
const express = require('express');
const app = express();
// `/users` プレフィックスを持つすべてのルートを usersRouter にルーティング
app.use('/users', require('./routes/users'));
app.listen(3000);
この方法の利点は、ミドルウェアを使用して共通の機能を再利用できることです。
どの方法を使用するかは、アプリケーションのニーズによって異なります。
app.js
const express = require('express');
const app = express();
// ファイル `./routes/users.js` からルートハンドラーをインポート
const usersRouter = require('./routes/users');
// `/users` プレフィックスを持つすべてのルートを usersRouter にルーティング
app.use('/users', usersRouter);
// ファイル `./routes/posts.js` からルートハンドラーをインポート
const postsRouter = require('./routes/posts');
// `/posts` プレフィックスを持つすべてのルートを postsRouter にルーティング
app.use('/posts', postsRouter);
app.listen(3000);
./routes/users.js
const express = require('express');
const router = express.Router();
// ユーザー関連のルートハンドラーを定義
router.get('/', (req, res) => {
res.send('ユーザー一覧');
});
router.get('/:id', (req, res) => {
res.send(`ユーザー ID: ${req.params.id}`);
});
module.exports = router;
const express = require('express');
const router = express.Router();
// 投稿関連のルートハンドラーを定義
router.get('/', (req, res) => {
res.send('投稿一覧');
});
router.get('/:id', (req, res) => {
res.send(`投稿 ID: ${req.params.id}`);
});
module.exports = router;
このコードを実行すると、次のルートが作成されます。
/users
- ユーザーの一覧を表示/posts
- 投稿の一覧を表示
このコードは、複数のファイルにルートハンドラーを含めるための基本的な例です。
Node.js と Express で複数のファイルにルートハンドラーを含めるその他の方法
ネストされたルーター
// ./routes/index.js
const express = require('express');
const router = express.Router();
// `/users` プレフィックスを持つすべてのルートを usersRouter にルーティング
router.use('/users', require('./users'));
// `/posts` プレフィックスを持つすべてのルートを postsRouter にルーティング
router.use('/posts', require('./posts'));
module.exports = router;
// ./routes/users.js
const express = require('express');
const router = express.Router();
// ユーザー関連のルートハンドラーを定義
router.get('/', (req, res) => {
res.send('ユーザー一覧');
});
router.get('/:id', (req, res) => {
res.send(`ユーザー ID: ${req.params.id}`);
});
module.exports = router;
// ./routes/posts.js
const express = require('express');
const router = express.Router();
// 投稿関連のルートハンドラーを定義
router.get('/', (req, res) => {
res.send('投稿一覧');
});
router.get('/:id', (req, res) => {
res.send(`投稿 ID: ${req.params.id}`);
});
module.exports = router;
// app.js
const express = require('express');
const app = express();
// ルーターを app にマウント
app.use('/', require('./routes'));
app.listen(3000);
ルートハンドラーのファクトリー関数を作成して、複数のファイルで再利用できます。 以下は例です。
// ./utils/routes.js
const getRouteHandler = (model) => {
return (req, res) => {
model.find({}, (err, docs) => {
if (err) {
return res.sendStatus(500);
}
res.send(docs);
});
};
};
// ./routes/users.js
const express = require('express');
const router = express.Router();
// ユーザーモデルを取得
const User = require('../models/User');
// ユーザー一覧を取得するルートハンドラー
router.get('/', getRouteHandler(User));
module.exports = router;
// ./routes/posts.js
const express = require('express');
const router = express.Router();
// 投稿モデルを取得
const Post = require('../models/Post');
// 投稿一覧を取得するルートハンドラー
router.get('/', getRouteHandler(Post));
module.exports = router;
この方法の利点は、コードをより DRY (Don't Repeat Yourself) に保つことができることです。
サードパーティライブラリ
express-route-loader
のようなサードパーティライブラリを使用して、ルートハンドラーを自動的にロードできます。
これらのライブラリは、コードをより簡潔に書くのに役立ちますが、使用方法を理解するのに時間がかかる場合があります。
- アプリケーションが比較的単純な場合は、
require()
を使用するのが最も簡単な方法です。 - アプリケーションが大きくて複雑な場合は、ネストされたルーターやルートハンドラーのファクトリー関数を使用すると、コードをより整理しやすくなります。
- コードをできるだけ簡潔に記述したい場合は、サードパーティライブラリを使用することを検討してください。
node.js express