※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。
Expressにおけるミドルウェアとは
Express.JSの根幹的な機構で、サードパーティのミドルウェアをNPMで簡単に組み込むこともでき、プログラマが独自のミドルウェアを追加して拡張することもできる。
Expressジェネレータが作成するスケルトンにもミドルウェアが各所で使われている。
ミドルウェアの役割とは
Expressの処理の流れをざっくり言うとブラウザからHTTPリクエストを受けとり、何らかの処理をしてレスポンスを返す。
ミドルウェアは名前の通り、この流れの中間に位置する処理のまとまり。
複数の異なる処理において共通する処理が、中間にあるとする。
この一連の処理を、現実世界の飲食店での注文の流れに例えると
1 客が商品を注文する。
2 注文を聞いて、注文表に記載し、厨房に伝える。
3 注文内容から、個別の料理法で料理を作る。
4 客に料理を出す。
5 料金を受け取る。
このような流れがあったとする。
Expressの処理の流れに合わせると、
1の 「客が料理を注文する。」というのが「ルーティング」に合致する。ユーザーがアクセスしてきたURLにより処理が変わる(注文内容により、作る料理が変わる)
3の 「注文を受けて、個別の料理法で料理をつくる。」と言う処理が、「ルーティングにより異なるコントローラーで処理をすること」に合致する。
2、4、5の処理についてはどのメニューが注文されたとしても、共通して処理する内容である。このような処理を行うのがミドルウェアとなる。
また、 4 → 5 のように、異なる処理のミドルウェアが連続して処理されることをミドルウェアチェーンと呼ぶ。
今、Expressのインスタンスをappという変数に格納した場合、下記のような記載でExpressにミドルウェアは組み込まれる。
const app = express();
app.use(function(req, res, next){
//ミドルウェアが行う処理。
next();//次のミドルウェアを実行する。
});
//この場合、全ての処理にミドルウェアの処理が組み込まれる。
app.use("/admin", function(req, res, next){
//この場合は URLが /admin 配下のルーティングに対し、ミドルウェアの処理が組み込まれる。
next();
});`
app.get("/admin", function(req, res, next){
next();
//メソッドを限定することも可能
});
ミドルウェアの種類
1 アプリケーション・レベルのミドルウェア
2 ルーター・レベルのミドルウェア
3 Express本体に標準装備されたミドルウェア
4 サード・パーティー・ミドルウェア
1 アプリケーション・レベルのミドルウェア
appにマウントするミドルウェア。引数として次の3つが決められている。
引数1 : リクエストオブジェクト (req) (ブラウザからのリクエスト情報を知る。)
引数2 : レスポンスオブジェクト (res) (ブラウザへのレスポンスを操作する。)
引数3 : 次のミドルウェアに処理を渡すコールバック(next)
※引数名については慣習的なものであるが特別な理由がない限り上記の3つを使うのが、混乱もなく無難。
var app = express();
app.use(function(req, res, next){
next();
});
2 ルーター・レベルのミドルウェア
router = express.Router()のrouterにマウントするミドルウェア。ルーターが複数あるときに個別のルーターに対してミドルウェアを直接マウントすることができる。
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
//処理
});
module.exports = router;
3Express本体に標準装備されたミドルウェア
expressジェネレーターでアプリを生成すると、標準で組み込まれているミドルウェアがある。
例えば
app.use(express.static(path.join(__dirname, 'public')));
これは、静的なファイルを配信するためのミドルウェア。引数に
expressオブジェクトのstatic(path.join(__dirname, 'public'))関数がミドルウェアとして組み込まれている。
なお、この関数は
return function (req, res, next) {
...
next();
}
というふうに、ミドルウェアの記述にのっとった関数を返すようになっている。
4 サード・パーティー・ミドルウェア
const app = express();
const cookieParser = require('cookie-parser');
app.use(cookieParser());
//cookieParserはクッキーを処理するためのミドルウェア
//モジュールインストール後、requireでモジュールロードし、
//app.useでミドルウェアとして処理を組み込んでいる。