3

node-http-proxy の上に構築され、squid/varnish のようなキャッシング サポートを追加する NPM モジュールを node.js で作成しようとしています。

私の頭では、次のように機能します。

  • 私の NPM モジュールは http-proxy に依存せず、 に与えられたコールバックを「ラップ」するだけhttp.createServerです。これを http-proxy と組み合わせるという考えですが、それを想定していません。
  • を調べreq、キャッシュされたバージョンがある場合はそれを提供します。
  • そうでない場合は、元のコールバックに委任し、応答を調べてキャッシュできるかどうかを確認します。
  • キャッシュが行われ、実際の応答が返されます。

ロジックは非常に単純ですが、私は node.js の内部構造と概念にあまり詳しくなく、応答のコンテンツを取得する方法を理解するのに苦労しています。

この例を考えると:

var http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
  res.write('Hello World!');
  res.end();
}).listen(80);

その応答オブジェクトからデータを取得するにはどうすればよいですか? 理想的には、遡及的にデータを引き出すのではなく、応答を「観察」し、データが書き込まれたときにデータを処理するだけです。

私はやってみました:

res.on('data', function(chunk) {
  console.log('Data written: ' + chunk);
});

しかし、それは決して呼び出されないようです。

次に試しました:

res.connection.on('data', function(chunk) {
  console.log('Data written: ' + chunk);
});

しかし、それは応答データではなく、要求データをダンプしただけです。応答がどのように生成されたかについて何も知らないと仮定して、応答データをフィルタリングする正しい方法は何ですか?

ノードの完全な理解不足を表明していて、ある種の「node.js コンセプトの初心者向けガイド」を読む必要がある場合は、これを参照してください。私は怠け者ではありません。ただ道に迷っているだけです。

編集 | write()メソッドを切り替えてwriteHead()、応答でそれらへの呼び出しをインターセプトできるように見えますが、これは間違っているように感じます。

4

2 に答える 2

1

ServerResponseの再定義 write および writeHead メソッドがそれを行う唯一の方法のようです。ノード API には、発信データを処理するためのネイティブ イベントはありません。

于 2012-08-14T12:05:28.013 に答える
1

最も簡単で効率的な方法は、これらの関数をカスタム関数に置き換えることです。http サーバーを作成するときは、コールバックmyhttp.createServerを呼び出しhttp.createServerてインターセプトしfunction(req, res)ます。元のオブジェクトresを呼び出すラッパーに置き換えます。ただし、呼び出しresをログに記録するためのロジックを追加できます。res.writeHead

于 2012-08-14T12:06:56.200 に答える