ミドルウェアがどのように機能するか、具体的には NodeJS の Connect モジュールを理解しようとしています。私はこのhttp://howtonode.org/connect-itを調べていて、この例を見つけました:
module.exports = function logItSetup() {
// Initialize the counter
var counter = 0;
return function logItHandle(req, res, next) {
var writeHead = res.writeHead; // Store the original function
counter++;
// Log the incoming request
console.log("Request " + counter + " " + req.method + " " + req.url);
// Wrap writeHead to hook into the exit path through the layers.
res.writeHead = function (code, headers) {
res.writeHead = writeHead; // Put the original back
// Log the outgoing response
console.log("Response " + counter + " " + code + " " + JSON.stringify(headers));
res.writeHead(code, headers); // Call the original
};
// Pass through to the next layer
next();
};
};
だから私はそれが着信要求と応答を記録していることを知っています。しかし、以下の記事の説明があっても、writeHead を置換関数に置き換える必要があることをまだ理解していません。
「setup 関数は、リクエスト全体でミドルウェアが使用する変数をセットアップするのに最適な場所です。この場合、ロガーのカウンターを初期化しています。
ハンドラーでは、ラッピング イディオムを使用して、writeHead の呼び出しにフックしています。JavaScript では、関数は他のものと同じように値です。したがって、関数をラップする優れた方法は、元の実装への参照をクロージャー変数に格納することです。関数を新しいものに置き換え、新しい関数の最初の行で、古い関数定義を元に戻します。次に、置換関数の最後の行で、元の関数を呼び出します。これは、実際の関数オブジェクトへの参照ではなく、名前でプロパティを検索するだけなので、既存のオブジェクト メソッドにフックする簡単で効率的な方法です。
スタンドアロンの console.log 呼び出しは、各リクエスト サイクルの開始時に呼び出され、ネストされた console.log は、ネストされた writeHead 関数によって途中で呼び出されます。"