概要
ミドルウェア関数は、アプリケーションの要求/応答サイクル内の要求オブジェクト ( req
)、応答オブジェクト ( )、および次のミドルウェア関数にアクセスできます。res
次のミドルウェア関数は通常、 next
という名前の変数で表されます。
ミドルウェア機能は次のタスクを実行できます。
- 任意のコードを実行します。
- リクエストおよびレスポンスオブジェクトに変更を加えます。
- リクエスト/レスポンスループを終了します。
- コールスタック内の次のミドルウェア。
現在のミドルウェア関数が要求/応答ループを終了しない場合は、そのミドルウェア関数を呼び出して next()
制御を次のミドルウェア関数に渡す必要があります。それ以外の場合、リクエストは保留されたままになります。
次の例は、ミドルウェア関数呼び出しの要素を示しています。
ミドルウェア機能が適用されるHTTPメソッド。 ミドルウェア機能が適用されるパス(ルート)です。 ミドルウェア機能。 ミドルウェア関数のコールバック引数。慣例により「next」と呼ばれます。 ミドルウェア関数へのHTTP 応答引数。慣例により「res」と呼ばれます。 ミドルウェア関数への HTTPリクエスト引数。慣例により「req」と呼ばれます。 |
以下は、2 つのミドルウェア関数が定義されている「Hello World」Express アプリケーションの簡単な例です。
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
開発する
以下は、「myLogger」と呼ばれるミドルウェア関数の簡単な例です。この関数は、アプリケーションのリクエストが通過した場合にのみ「LOGGED」を表示します。ミドルウェア関数は、 myLogger
という名前の変数に割り当てられます。
var myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
上記の next()
への呼び出しに注意してください。この関数が呼び出されると、アプリケーション内の次のミドルウェア関数が呼び出されます。 next()
関数は Node.js または Express API の一部ではありませんが、ミドルウェア関数に渡される 3 番目の引数です。next()
関数には任意の名前を付けることができますが、慣例により常に「next」という名前が付けられます。混乱を避けるために、常にこの規則を使用してください。
ミドルウェア関数をロードするには、 app.use()
ミドルウェア関数を呼び出して指定します。たとえば、次のコードは、ルート パス (/) のルートの前にミドルウェア関数をロードします myLogger
。
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」というメッセージを表示します。
ミドルウェアがロードされる順序は重要です。最初にロードされたミドルウェア関数も最初に実行されます。
ルート パスの Route の後にロードされた場合 myLogger
、ルート パスのルート ハンドラーが要求/応答ループを終了するため、リクエストは関数に到達せず、アプリケーションには「LOGGED」が表示されません。
ミドルウェア関数は myLogger
メッセージを表示するだけで、 next()
関数を呼び出すことでスタック内の次のミドルウェア関数にリクエストを渡します。
次の例では、 requestTime
リクエスト オブジェクトに名前付きのプロパティを追加します。このミドルウェア関数に「requestTime」という名前を付けます。
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!';
responseText += 'Requested at: ' + req.requestTime + '';
res.send(responseText);
});
app.listen(3000);
アプリケーション ルートにリクエストを行うと、このアプリケーションは現在ブラウザにリクエストのタイムスタンプを表示しています。
リクエスト オブジェクト、レスポンス オブジェクト、スタック内の次のミドルウェア関数、および Node.js API 全体にアクセスできるため、ミドルウェア関数の可能性は無限です。