問題をよりよく説明するために更新されました:実装者がオリジンサーバーからの応答をリッスンして変更できるようにする単純なプロキシサーバーモジュールを構築しようとしています。プロキシが応答を受信するcustomResponse
と、応答ストリームへの参照を含むメッセージを送信しています。そのイベントをリッスンする人は誰でも、応答にパイプして、カスタム ビジネス ロジックを実装できる必要があります。モジュールは、クライアントに戻る「最終」パイプを処理する必要があります。そうしないと、プロキシにはなりません (以下のコード例を参照)。
インストール
npm install eventemitter3 && npm install event-stream && touch index.js
index.js
var http = require("http"); var EE3 = require('eventemitter3'); var es = require("event-stream"); var dispatcher = new EE3(); dispatcher.on("customResponse", function (response) { // Implementers would implement duplex or transform streams here // and modify the stream data. response.pipe(es.mapSync(function (data) { return data.toString().replace("sometext", "othertext"); })); }); http.createServer(function (req, res) { // BEGIN MODULE CODE - THIS WILL HAVE AN API AND WILL RETURN // THE EVENT EMITTER FOR IMPLEMENTERS TO LISTEN TO http.request({ host: "localhost", port: 9000, path: "/path/to/a/file.txt" }, function (response) { // Dispatch the event, allow consumers to pipe onto response dispatcher.emit("customResponse", response); // Here's where the problem is - the "response" stream // may have been piped onto, but we don't have a reference // to that new stream. If the data was modified by a consumer, // we don't see that new data here. response.pipe(res); }).end(); // END MODULE CODE }).listen(7000);