概要: このチュートリアルでは、Express Routerを使ってルーティングロジックをモジュール化し、整理する方法を学びます。
Express Routerは、個別のファイルでルーティングを定義することで、Expressアプリケーションのルーターを整理し、モジュール化するのに役立ちます。
Express Routerの使用例を見てみましょう。
Expressアプリケーションの作成
ステップ1. express-router-demo
のような新しいプロジェクトディレクトリを作成します。
mkdir express-router-demo
cd express-router-demo
Code language: JavaScript (javascript)
ステップ2. npm init
コマンドを実行してプロジェクトを初期化します。
npm init -y
Code language: JavaScript (javascript)
これにより、プロジェクトディレクトリにpackage.json
ファイルが作成されます。
ステップ3. プロジェクトディレクトリに.env
ファイルを作成し、PORT
定数を値3000
で定義します。
PORT=3000
Code language: JavaScript (javascript)
ステップ4. package.json
ファイルを構成します。
...
"type": "module",
"scripts": {
"start": "node --env-file=.env --watch index.js"
},
...
Code language: JavaScript (javascript)
package.json
ファイルで
- ESモジュールを使用するために、
"type": "module"
エントリを追加します。 scripts
セクションに、index.js
ファイルを監視し、アプリの起動時に.env
ファイルをロードするための"start": "node --env-file=.env --watch index.js"
エントリを追加します。
ステップ5. express
パッケージをインストールします。
npm install express
Code language: JavaScript (javascript)
ステップ6. 次のコードでindex.js
ファイルを作成します。
import express from 'express';
const app = express();
const PORT = process.env.PORT || 3000;
// Todo routes
app.get('/todos', (req, res) => {
res.send('A list of todo items');
});
app.post('/todos', (req, res) => {
res.send('Create a new todo item');
});
app.put('/todos/:id', (req, res) => {
const { id } = req.params;
res.send(`Update the todo item with id ${id}`);
});
app.delete('/todos/:id', (req, res) => {
const { id } = req.params;
res.send(`Delete the todo item with id ${id}`);
});
app.get('/todos/:id', (req, res) => {
const { id } = req.params;
res.send(`Get the todo item with id ${id}`);
});
app.listen(PORT, () => {
console.log(`The server is listening on port ${PORT}.`);
});
Code language: JavaScript (javascript)
index.js
はexpressアプリケーションを起動し、todo
リソースを管理するためのさまざまなルートを定義します。このアプリは動作しますが、次の潜在的な問題があります。
- モノリシックなサイズ – コードを追加するとindex.jsが大きくなり、異なる部分に移動するのが難しくなります。
- 保守性 – コードの他の部分に影響を与えずに新しい機能を追加するなど、ファイルの保守が難しくなります。
- 関心の分離の欠如 – 単一のファイルにルート、ミドルウェア、およびアプリケーション設定を混在させると、関心の分離の原則に違反し、アプリのさまざまな部分を理解するのが難しくなります。
- スケーラビリティ – アプリが成長すると、新しいルートを追加するのが難しくなり、開発時間が長くなります。
- テスト – すべてのルートが同じファイルにあるため、個々のルートグループをテストするのが難しく、アプリが正しく動作することを保証するのが難しくなります。
Express Routerの使用
ステップ1. プロジェクトディレクトリ内にroutes
という新しいディレクトリを作成します。
cd express-router-demo
mkdir routes
Code language: JavaScript (javascript)
ステップ2. routes
ディレクトリ内にtodos.js
という新しいファイルを定義します。
import express from 'express';
const router = express.Router();
router.get('/todos', (req, res) => {
res.send('A list of todo items');
});
router.post('/todos', (req, res) => {
res.send('Create a new todo item');
});
router.put('/todos/:id', (req, res) => {
const { id } = req.params;
res.send(`Update the todo item with id ${id}`);
});
router.delete('/todos/:id', (req, res) => {
const { id } = req.params;
res.send(`Delete the todo item with id ${id}`);
});
router.get('/todos/:id', (req, res) => {
const { id } = req.params;
res.send(`Get the todo item with id ${id}`);
});
export default router;
Code language: JavaScript (javascript)
仕組み
まず、express
ライブラリからexpress
関数をインポートします。
import express from 'express';
Code language: JavaScript (javascript)
次に、Router
の新しいインスタンスを作成します。
const router = express.Router();
Code language: JavaScript (javascript)
このRouter
インスタンスを使用すると、モジュール方式でルートを定義および管理できます。
3番目に、Router
オブジェクトを使用して、todo
リソースのroutes
を定義します。
router.get('/', (req, res) => {
res.send('A list of todo items');
});
router.post('/', (req, res) => {
res.send('Create a new todo item');
});
router.put('/:id', (req, res) => {
const { id } = req.params;
res.send(`Update the todo item with id ${id}`);
});
router.delete('/:id', (req, res) => {
const { id } = req.params;
res.send(`Delete the todo item with id ${id}`);
});
router.get('/:id', (req, res) => {
const { id } = req.params;
res.send(`Get the todo item with id ${id}`);
});
Code language: JavaScript (javascript)
これらのルートでは、/todos
または/todos/:id
を明示的に指定する必要はありませんが、/
および/:id
を指定します。この機能は、ルートプレフィックスと呼ばれます。
ルートプレフィックスを使用すると、共通のパスセグメントでルートにプレフィックスを付けることができます。このルートプレフィックスは、後でindex.js
ファイルで使用します。
4番目に、ルーターをデフォルトのエクスポートとしてエクスポートします。
export default router;
Code language: JavaScript (javascript)
ステップ3. 次のようにindex.js
ファイルを変更します。
import express from 'express';
import todoRoutes from './routes/todos.js';
const app = express();
const PORT = process.env.PORT || 3000;
app.use('/todos', todoRoutes);
app.listen(PORT, () => {
console.log(`The server is listening on port ${PORT}.`);
});
Code language: JavaScript (javascript)
index.jsファイルで
まず、'./routes/todos.js'
モジュールからtodoRoutes
をインポートします。
import todoRoutes from './routes/todos.js';
Code language: JavaScript (javascript)
/routes/todos.js
モジュールからrouter
オブジェクトをデフォルトのエクスポートとしてエクスポートしているため、インポート時に任意のエイリアスを使用できます。
この例では、todoRoutes
を使用して、より明確にしています。アプリが大きくなると、userRoutes
、noteRoutes
などのルーターが増える可能性があります。
2番目に、app.use()
メソッドを使用して、/todos
パスにtodoRoutes
をマウントします。
app.use('/todos', todoRoutes);
Code language: JavaScript (javascript)
この例では
/todos
はパスプレフィックスです。todoRoutes
はルーターであるため、/todos
へのリクエストは、todoRoutes
で定義された対応するルートハンドラーによって処理されます。
パスプレフィックスは、/routes/todos.js
で定義されたすべてのルートに/todos
をプレフィックスとして付加します。
たとえば、GET /todos/
はrouter.get('/', ...)
によって処理され、GET /todos/:id
はルートrouter.get('/todos/:id', ...)
によって処理されます。
ルートをindex.js
から/routes/todos.js
に移動し、Express Routerを使用することで、コードの保守性とスケーラビリティが向上します。
プロジェクトのソースコードをダウンロード
概要
- Express Routerを使用して、ルートを個別のモジュールに整理し、よりスケーラブルで保守性の高いコードベースを実現します。