Express 4 Routing の詳細

投稿日 2015/07/11

[Home] | [Express 4 Top] | [Express 4 の詳細]

概要

ルーティング (Routing: 経路) は、アプリケーションへ到達するための URI の定義で、それにより、クライアントのリクエストに対して応答する。

ルート (経路) は URI と HTTP メソッド (GET, POST など) およびハンドラの組み合わせである。ルートは次のような構造を持つ。

app.METHOD(path, [callback...], callback)

app は express のインスタンス、METHOD は HTTP のリクエストメソッド、path はサーバ上のパスである。そして、ルートに一致したとき、特定の関数がコールバックされる。

基本的なルートを以下に示す。

var express = require('express');
var app = express();

// ホームページへの GET リクエストを受けると "hello world" を返す。
app.get('/', function(req, res) {
  res.send('hello world');
});

Route メソッド

Route メソッドは、HTTP メソッドに由来し、express のインスタンスにひもづけされる。

次の例は、GET と POST メソッドに対するルートである。

// GET メソッドのルート
app.get('/', function (req, res) {
  res.send('GET request to the homepage');
});

// POST メソッドのルート
app.post('/', function (req, res) {
  res.send('POST request to the homepage');
});

express は以下のルーティングメソッドを用意している。


さらに、特別なルーティングメソッド app.all() がある。これは、すべての HTTP メソッドに反応する。

次の例は、リクエスト /secret に対するGET, POST, PUT, DELETE その他メソッドに反応する。

app.all('/secret', function (req, res, next) {
  console.log('Accessing the secret section ...');
  next(); // pass control to the next handler
});

Route パス

Route パスはリクエストメソッドの組み合わせである。それは、単純な文字列だけでなく文字列パターンや正規表現も利用できる。

単純な文字列のパスの例

// root (/) と一致したとき
app.get('/', function (req, res) {
  res.send('root');
});

// /about と一致したとき
app.get('/about', function (req, res) {
  res.send('about');
});

// /random.text と一致したとき
app.get('/random.text', function (req, res) {
  res.send('random.text');
});

文字列パターンのパスの例

// acd と abcd に一致したとき
app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});

// abcd, abbcd, abbbcd などに一致したとき
app.get('/ab+cd', function(req, res) {
  res.send('ab+cd');
});

// abcd, abxcd, abRABDOMcd, ab123cd などに一致したとき
app.get('/ab*cd', function(req, res) {
  res.send('ab*cd');
});

// /abe と /abcde に一致したとき
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

正規表現のパスの例

// ルート名に一致したとき
app.get(/a/, function(req, res) {
  res.send('/a/');
});

// butterfly, dragonfly は一致、butterflyman は不一致
app.get(/.*fly$/, function(req, res) {
  res.send('/.*fly$/');
});

Route ハンドラ

ミドルウェアのような多重コールバック関数を持つことができる。唯一の違いは、これらのコールバックは、next('route') を呼び出して残りのコールバックをバイパスできることである。

このメカニズムによりルートを事前に処理して、パスの制御を行える。

ルートハンドラは、次の例のように、1つの関数だけでなく、関数の配列やそれらの組み合わせが許される。

(例1) ハンドラが1つの関数

app.get('/example/a', function (req, res) {
  res.send('Hello from A!');
});

(例2) ハンドラは2つ以上でもよい (next オブジェクトが必要)

app.get('/example/b', function (req, res, next) {
  console.log('response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from B!');
});

(例3) ルートは関数の配列でもよい

var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

var cb2 = function (req, res) {
  res.send('Hello from C!');
}

app.get('/example/c', [cb0, cb1, cb2]);

(例4) ルートは関数と関数配列の組み合わせでもよい

var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

app.get('/example/d', [cb0, cb1], function (req, res, next) {
  console.log('response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from D!');
});

ルートにリクエスト変数を含めるには :name を使用する。ここで name はその変数名である。

router.get('/example/test/:name', function(req, res) {
  var name = req.params.name;
    // ...
});

(参考) POST では req.body, GET では req.query を使用してフォームの内容を取得する。


レスポンスメソッド

メソッド 説明
res.download() ファイルがダウンロードされたことをシステムに示す。
res.end() レスポンス動作が終わったことをシステムに示す。
res.json() JSON レスポンスを返す。
res.jsonp() JSONP レスポンスを返す。
res.redirect() リクエストをリダイレクトする。
res.render() ビューテンプレートをレンダー (HTML化)する。
res.send() 各種(一般の)のレスポンスを返す。
res.sendFile() Octed ストリームとしてファイルをレスポンスとして返す。
res.sendStatus() ステータスコードをレスポンスボディに付ける。

app.route()

app.route() を使用すると、チェイン化したルートハンドラを作成できる。これにより、パスは1つだが、モジュール形式のルートで冗長性を軽減できる。

チェイン化したルートの例を示す。

app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });

express.Router

express.Router クラスは、組み立て式のルートハンドラを作成するのに使用できる。ルーターインスタンスは、完全なミドルウェアかつルーティングシステムなので、それ自身が1つのミニappのように動作する。

次の例は、モジュールとしてルータを作成し、それ自身でミドルウェアをロードし、ルートを定義しパスをマウントする。

次の例は、ルータのファイル birds.js を作成する。

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

// このルータのミドルウェア
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// ホームページルートの定義
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// /about ルートの定義
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

app 内でルータモジュールをロードする。

var birds = require('./birds');
//...
app.use('/birds', birds);

timeLog ミドルウェアで app は /birds と /birds/about というリクエストに応答する。

 

 


 

 開設 2014年12月   著作権 2014-2015 bonk.red  連絡先: こちらからメッセージを送ってください。

 このページの先頭へ..