0

最近Nodejitsuのブログを読みましたが、このコードがどのように機能するのか疑問に思っています。

var fs = require('fs'),
http = require('http'),
httpProxy = require('../lib/node-http-proxy');


module.exports = function (logging) {
  // Code here is run when the middleware is initially loaded.
  var logFile = fs.createWriteStream('./requests.log');

  return function (request, response, next) {
    // Code here is run on each request.
    if (logging) {
      logFile.write(JSON.stringify(request.headers, true, 2));
    }
    next();
  }
}

このコードの説明は次のとおりです。

このミドルウェアは、非常に単純なロギング用です。各リクエストのヘッダーをログ ファイルに書き込みます。

エクスポートされた上記のモジュールは、次のように使用できます。

httpProxy.createServer(
  require('./example-middleware')(true),
  8000, 'localhost'
).listen(9000)

next()すべてのリクエストで呼び出される上記のメソッドのコードはどのようになっていますか? 使い方はとても簡単です: 上記のモジュールを require すると、毎回呼び出されます。

4

2 に答える 2

2

実際のプロセスを単純化しますが、その要点は次のとおりです。

リクエストが届くと、ノードはリクエストとレスポンス オブジェクトをミドルウェア スタックの最初のミドルウェアに渡します。そのミドルウェアが何らかの方法で応答を送信するか接続を閉じると、後続のミドルウェアは呼び出されません。それ以外の場合、そのミドルウェアはノードに、ミドルウェア スタックを移動し続ける仕事が終了したことを通知する必要があるため、ミドルウェア内で next() を呼び出して、ミドルウェアの処理を続行するように通知します。

于 2012-06-19T15:09:32.830 に答える
1

さて、これはかなり一般的なことです。このモジュールに含まれているのは、この行で指定された単一の関数であり、module.exports を関数に設定しますmodule.exports = function (logging) {。モジュールによって返される (したがって によって返されるrequire()) 関数は、HTTP プロキシのミドルウェアである別の関数を返します (このミドルウェアを使用すると、リクエストを変換できます)。このミドルウェア関数は、サーバーに対して行われるすべての HTTP 要求に対して呼び出されます。Quickredfox の回答は、ミドルウェアのかなり良い説明を提供します。

したがって、 はrequire('./example-middleware')(true)に割り当てられた関数を実際に呼び出しますが、module.exportsその内部の関数は呼び出しません。関数はすぐに返され、ミドルウェアとしてhttpProxy.createServer関数に渡されます。これは、クロージャを使用してミドルウェアのいくつかのオプションを設定する良い方法です。さらに質問がある場合は、お気軽にコメントしてください。:D

于 2012-06-19T15:44:10.253 に答える