概要
ミドルウェア関数は、アプリケーションのリクエストオブジェクト(req
res
next
next
next
関数は、Expressルータ内の関数で、呼び出されると、現在のミドルウェアの後続のミドルウェアを実行します。
ミドルウェアの関数は、以下のタスクを実行できます。
現在のミドルウェア関数がリクエストとレスポンスのサイクルを終了しない場合は、next()
を呼び出して次のミドルウェア関数に制御を渡さなければなりません。
次の図は、ミドルウェア機能の呼び出しの要素を示しています。
ミドルウェア機能が適用されるHTTPメソッドです。
ミドルウェア機能が適用されるパス(ルート)
ミドルウェア機能
ミドルウェア機能へのコールバック引数(規約では “next “と呼ばれます)。
ミドルウェア機能へのHTTPレスポンス引数(規約では「res」と呼ぶ)
ミドルウェア機能へのHTTPリクエスト引数(規約では「req」と呼ぶ)div
|
Express 5から、Promiseを返すミドルウェア関数は、拒否やエラーを投げるときにnext(value)
next
は、拒否された値またはスローされたエラーで呼び出されます。
Example
ここでは、シンプルな「Hello World」Expressアプリケーションの例を示します。myLogger
requestTime
はHTTPリクエストのタイムスタンプを表示し、validateCookies
は受信したCookieを検証します。
var express = require('express')var app = express()app.get('/', function (req, res) { res.send('Hello World!')})app.listen(3000)
ミドルウェア関数 myLogger
ここでは、「myLogger」と呼ばれるミドルウェア関数の簡単な例を紹介します。 この関数は、アプリへのリクエストが通過すると「LOGGED」と表示するだけです。 このミドルウェア関数は、myLogger
という名前の変数に割り当てられています。
var myLogger = function (req, res, next) { console.log('LOGGED') next()}
上記のnext()
next()
関数は、Node.jsやExpressのAPIの一部ではありませんが、ミドルウェア関数に渡される3番目の引数です。
ミドルウェア関数をロードするには、ミドルウェア関数を指定して app.use()
を呼び出します。
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)
アプリがリクエストを受け取るたびに、ターミナルに「LOGGED」というメッセージが表示されます。
ミドルウェアのロードの順番は重要で、最初にロードされたミドルウェア関数は最初に実行されます。
ルートパスへのルートの後に myLogger
がロードされた場合、ルートパスのルートハンドラがリクエスト-レスポンスサイクルを終了させるため、リクエストはルートに到達せず、アプリは「LOGGED」と表示しません。
ミドルウェア関数 myLogger
next()
関数を呼び出すことで、スタック内の次のミドルウェア関数にリクエストを渡します。
ミドルウェア関数requestTime
次に、「requestTime」というミドルウェア関数を作成し、requestTime
というプロパティをrequestオブジェクトに追加します。
var requestTime = function (req, res, next) { req.requestTime = Date.now() next()}
これでアプリはrequestTime
req
(リクエストオブジェクト)に追加したプロパティを使用します。
var express = require('express')var app = express()var requestTime = function (req, res, next) { req.requestTime = Date.now() next()}app.use(requestTime)app.get('/', function (req, res) { var responseText = 'Hello World!<br>' responseText += '<small>Requested at: ' + req.requestTime + '</small>' res.send(responseText)})app.listen(3000)
アプリのルートにリクエストを行うと、ブラウザにリクエストのタイムスタンプが表示されるようになりました。
ミドルウェア関数 validateCookies
最後に、受信したCookieを検証し、Cookieが無効な場合は400レスポンスを送信するミドルウェア関数を作成します。
ここでは、外部の非同期サービスを使ってクッキーを検証する関数の例を紹介します。
async function cookieValidator (cookies) { try { await externallyValidateCookie(cookies.testCookie) } catch { throw new Error('Invalid cookies') }}
ここでは、cookie-parser
req
オブジェクトから受信した Cookie を解析し、cookieValidator
関数に渡します。
var express = require('express')var cookieParser = require('cookie-parser')var cookieValidator = require('./cookieValidator')var app = express()async function validateCookies (req, res, next) { await cookieValidator(req.cookies) next()}app.use(cookieParser())app.use(validateCookies)// error handlerapp.use(function (err, req, res, next) { res.status(400).send(err.message)})app.listen(3000)
next()
await cookieValidator(req.cookies)
cookieValidator
next()
'route'
'router'
を除く)、Express は現在のリクエストをエラーと見なし、残りのエラー処理ではないルーティングやミドルウェアの関数をスキップします。
リクエストオブジェクト、レスポンスオブジェクト、スタック内の次のミドルウェア関数、そしてNode.js API全体にアクセスできるため、ミドルウェア関数の可能性は無限大です。
Expressミドルウェアの詳細については、以下を参照してください。
設定可能なミドルウェア
ミドルウェアを設定可能にする必要がある場合は、オプションオブジェクトやその他のパラメータを受け取り、入力されたパラメータに基づいてミドルウェアの実装を返す関数をエクスポートします。
ファイル: my-middleware.js
module.exports = function (options) { return function (req, res, next) { // Implement the middleware function based on the options object next() }}
このミドルウェアは、以下のように使用することができます。