n_hachiのメモ

メモです。

Express web framework (Node.js/JavaScript)の勉強 part2

Creating route handlersを読みすすめる

前回、特定のパスへのリクエストを受け取り、対応するコールバック関数を実行する方法を学んだ。 今回は express.Router についてを学ぶ

Router

express.Router を使うことで、特定のパスへのリクエストをまとめて扱うことが可能になる。
ここの例では http://localhost:3000/wiki/ 以下へのリクエストを解釈するrouterインスタンスを作成している。
具体例として以下に wiki.js というファイルを示す

wiki.js

// wiki.js - Wiki route module

const express = require('express');
const router = express.Router();

// Home page route
router.get('/', function(req, res) {
  res.send('Wiki home page');
});

// About page route
router.get('/about', function(req, res) {
  res.send('About this wiki');
});

module.exports = router;

4行目 const router = express.Router()

express.Router を使うことでモジュール化されたのマウント可能なルートハンドラを作成できる。
別ファイルで特定のパス(今回は /wiki プレフィックスとする)を指定することで、そのパスへ以下へのリクエストをルーティングするとが可能になる。

7〜9行目 router.get('/', function(req, res){ ...以下略

特定のパス以下の / へのリクエストを第二引数の関数へルーティングする
今回の例では/wikiへのリクエストをルーティングする

12〜14行目 router.get('/about', function(req, res){ ...以下略

特定のパス以下の /about へのリクエストを第二引数の関数へルーティングする 今回の例では/wiki/aboutへのリクエストをルーティングする

16行目 module.exports = router;

ここまでで作成したrouterオブジェクトを別ファイルで使用できるようにエクスポートする

app.js

const express = require('express');
const app = express();
const port = 3000;

const wiki = require('./wiki.js');

app.get('/', (req, res) => {
  res.send('Hello World!')
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`)
});

app.use('/wiki', wiki);

5行目 const wiki = rquire('./wiki.js');

nodejsはCommonJSのモジュールシステムを採用している。
* 参考:What is require? | Node.js
CommonJSではrequireを使うことでモジュールを取り込む。
requireはモジュールの名前もしくはパスを引数にとる。

15行目 app.use('/wiki', wiki);

appは関数以外にも、特定のミドルウェアの機能を特定のパスに関連付けることができる。
今回の例ではパス/wikiとオブジェクトwikiが、それぞれapp.useの第一、第二引数に使われている。
/wiki/aboutへの要求はwikiオブジェクトへ渡り、/wiki/aboutからプレフィックス/wikiを除いたパス/aboutを使いwikiオブジェクト内でマッチングが行われる。
結果wiki.jsの12行目で定義されたパスにマッチし、対応する関数が実行される。

まとめ

  • routerは別ファイルにまとめることで、特定のパス以下の処理を分割することができる