はじめに
この記事では、Expressを使いこなす上で必須となる、「ミドルウェア」について説明します。Expressをこれから使い始める方、使い始めて間もない方を対象にした基本的な内容になります。
現在の最新バージョンである4.17.1で動作を確認しています。
Expressとミドルウェア
ExpressはNode.js環境で使われる最も人気のあるWebアプリケーションフレームワークのうちの一つです。最小限の機能を提供する薄いフレームワークになっていて、ユーザーの自由度が高い点が特徴的です。(例えば、データベースアクセス、認証をExpressは提供しません。)
また、ドキュメントにある通り、「Expressアプリケーションは一連のミドルウェア関数呼び出し」といえます。つまり、ユーザーからのHTTPリクエストを受信しレスポンスを返すまでに、いくつかのミドルウェア関数を通過し、リクエストからレスポンスまでのサイクルが完了します。
ミドルウェアとは
ミドルウェアとは、リクエストオブジェクトとレスポンスオブジェクトを受け取り、任意の処理を行う関数です。また、「Expressは一連のミドルウェア関数の呼び出し」と言われるように、次のミドルウェアへと処理を継続するか、もしくはリクエストレスポンスサイクルをそこで終了させるかのいずれかを行います。
次の関数を見てください。
/*
ドキュメントを元に作成
*/
var myLogger = function (req, res, next) {
// 何か処理を行う
console.log('LOGGED')
// 次のミドルウェアに処理を移す
next()
}
この例では、"LOGGED"の文字列を表示した後、nextを使って、次のミドルウェアへと処理が流れていきます。
実際の使い方とリクエストレスポンスサイクルを終了する例については、この後紹介します。
アプリケーション全体(複数のミドルウェア関数を使う)
次は、二つのミドルウェア関数を使う例です。expressモジュールをインストール済みであれば、このまま実行可能です。(npm install express
)
/*
ドキュメントを元に作成
*/
var express = require('express')
// アプリケーションオブジェクトの作成
var app = express()
// ミドルウェアの定義
var myLogger = function (req, res, next) {
console.log('LOGGED')
// 次のミドルウェアへ
next()
}
// ミドルウェアの読み込み
app.use(myLogger)
// パスを限定してミドルウェアを適用
app.get('/', function (req, res) {
// ミドルウェア関数の連鎖はここでおしまい
res.send('Hello World!')
})
app.listen(3000)
ミドルウェア関数を読み込む順序も重要です。上記の例では、res.send
を含むミドルウェア関数を先に読み込んでしまうと、myLoggerは実行されません。res.send
で一連のサイクルが終了してしまうからです。
サード・パーティー・ミドルウェアを使う
先ほどの例のように自作でミドルウェア関数を作成することができますが、頻繁に行われる処理については、サード・パーティー・ミドルウェアが存在します。
例えば、リクエストボディのJSONへの変換、cookieの読み取り、認証処理、ヘッダーの操作などです。
ここに一覧がまとまっています。
読み込ませ方は、自作ミドルウェアの場合と変わりません。たとえば、"cookie-parser"の場合は次のようになります。
var cookieParser = require('cookie-parser')
app.use(cookieParser())
設定方法等は各モジュールによって違いますので、それぞれのドキュメントを参照してください。
以上です。