Express 4 ミドルウェアの使用

投稿日 2015/07/11

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

概要

Express はそれ自身は最小の機能しか持たないルーティングおよびミドルウェアのウェブフレームワークである。Express アプリケーションは基本的には、ミドルウェアを呼び出すことに専念するものである。

ミドルウェアは、リクエストオブジェクト (req) 、レスポンスオブジェクト (res) 、およびアプリケーションの request-response サイクルで次のミドルウェアを呼び出す機能 (next) を持つ。

ミドルウェアは以下の機能を持つ。

もし、現在のミドルウェアが request-response サイクルを終えていない場合、next() を呼び出してコントロールを次のミドルウェアに渡す必要がある。さもなければ、リクエストは中断されたままになる。

Express アプリケーションは、次のミドルウェアを使用できる。

application-level と router-level ミドルウェアはオプションのマウントパスでロードできる。また、あるマウントポイントでミドルウェアシステムのサブスタックを作成するため、ミドルウェア関数のシリーズをロードすることもできる。


Application-level ミドルウェア

Application-level ミドルウェアを app オブジェクトに結合するには、app.use() と app.METHOD() を使う。ここで、METHOD は GET や POST などの HTTP メソッドである。

var app = express();

// マウントパスがないミドルウェア。app へのリクエストのたびに実行される。
app.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// /user/:id にマウントされるミドルウェア。user/:id へのリクエストごとに実行される。
app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

// /user/:id への GET リクエストのハンドラ
app.get('/user/:id', function (req, res, next) {
  res.send('USER');
});

あるマウントパスに対するマウントポイントで、ミドルウェアのシリーズをロードする例

// /user/:id への任意のタイプの HTTP リクエストに対してリクエストを表示するミドルウェアサブスタック
app.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

あるパスに対する多重ルートを定義したハンドラ。下の例では GET /user/:id の2つのルートを定義している。

// GET /user/:id を操作するミドルウェアサブスタック
app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id);
  next();
}, function (req, res, next) {
  res.send('User Info');
});
// /user/:id に対してユーザIDを表示するハンドラ
app.get('/user/:id', function (req, res, next) {
  res.end(req.params.id);
});

ルータのミドルウェアスタックの残りをスキップするため、next('route') を呼び出す例。※ next('route') は app.METHOD() または router.METHOD() でロードしたミドルウェアのみに有効である。

// GET /user/:id を受け持つサブスタック
app.get('/user/:id', function (req, res, next) {
  // もし、ユーザ ID が 0 なら次のルートへ移行する。
  if (req.params.id == 0) next('route');
  // そうでなければ、このスタックの次のミドルウェアへ制御を渡す。
  else next();
}, function (req, res, next) {
  // regular ページを作成
  res.render('regular');
});

// /user/:id に対する special ページを作成するハンドラ
app.get('/user/:id', function (req, res, next) {
  res.render('special');

Router-level ミドルウェア

Router-level ミドルウェアは、application-level ミドルウェアのように動作するが、express.Router() のインスタンスにバインドされる。

var router = express.Router();

Router-level ミドルウェアは、router.use() と router.METHOD() を使用してロードする。

次の例は、router-level ミドルウェアを使い上の application-level ミドルウェアのように middleware システムを複製する。

var app = express();
var router = express.Router();

// マウントパスがない場合、すべてのリクエストに応答する。
router.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// /user/:id に対する任意のリクエストにとうとうするサブスタック
router.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});
// GET /user/:id に応答するサブスタック
router.get('/user/:id', function (req, res, next) {
  // もし、ユーザ ID が 0 なら次のルートへ移行する。
  if (req.params.id == 0) next('route');
  // そうでなければ、このスタックの次のミドルウェアへ制御を渡す。
  else next(); //
}, function (req, res, next) {
  // regular ページを作成
  res.render('regular');
});

// /user/:id に対する special ページを作成するハンドラ
router.get('/user/:id', function (req, res, next) {
  console.log(req.params.id);
  res.render('special');
});

// app の router にマウント
app.use('/', router);

ミドルウェアのエラー処理

error-handling ミドルウェアは4つの引数 (err, req, res, next) をもつ。

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

Built-in ミドルウェア

Express 4.x は Connect を利用しない。express.static を除き、すべてのミドルウェアは、Express に包含されている。

express.static(root, [options])

Express の唯一のビルトインミドルウェアは、express.static である。これは、serve-static に基づいており、スタティックな資源をサービスする。

root パラメータは、static な資源からの root ディレクトリを指定する。

options パラメータは、以下のように定義されている。

var options = {
  dotfiles: 'ignore',
  etag: false,
  extensions: ['htm', 'html'],
  index: false,
  maxAge: '1d',
  redirect: false,
  setHeaders: function (res, path, stat) {
    res.set('x-timestamp', Date.now());
  }
}

app.use(express.static('public', options));

Third-party ミドルウェア

Third-party ミドルウェアは npm コマンドでインストールする。例えば、cookie-parser は以下のようにしてインストールする。

$ npm install cookie-parser

cookie-parser の利用

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');

// cookie-parser をロードする。
app.use(cookieParser());

 

 


 

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

 このページの先頭へ..