0

クライアントから直接アクセスしないCDNサーバーにいくつかのファイルが保存されています。したがって、私はExpressJSを実行している公開アクセス可能なサーバーを介してリクエストをプロキシし、requestモジュールを使用してデータサーバー側を取り出し、それを応答として返します。プロキシリクエスト中にExpressJSで応答ヘッダーを追加/削除する方法

働いて、コードに次のようなものになりますされています。私は上記の方法に直面して問題がある

var request = require('request'); 
var app = express(); 
var internalUrl = 'https://my.storage-cdn.com/private/info/file.xml'; 

app.get('/somefile.xml', function (req, res) { 
    request(internalUrl).pipe(res); 
}); 

を:

  • ストレージ/ CDNサーバは 、独自のいくつかのレスポンスヘッダを付加しこれには秘密の情報が含まれており、そのようなものは応答として公開されたときにセキュリティ の問題になる可能性があります。そして上記のres オブジェクトをrequestにパイプする方法では、これらのヘッダーは削除されません。応答にはそのまま ヘッダーが渡されます。私はそれらのヘッダーを削除したい。
  • eTagとキャッシュコントロールヘッダーを追加して、ファイルが正しくキャッシュされるようにしたいです 。

私はこのような何かにそれを変更しようとしている:

app.get('/somefile.xml', function (req, res) { 
    request(internalUrl, function (err, response, body) { 
     if (!err && response.statusCode == 200) { 
      res.writeHead(200, {...}); // write custom headers I need 
      res.end(body); 
     } 
    }); 
}); 

これは私が私の好みに合わせて、ヘッダーを上書きすることができますが、この方法では、私が上で、ダウンロード取得するファイル全体を待つ必要が私のレスポンスにバイトを送るのを開始する前に、まずサーバー側で、1MBもの大きさのファイルがあると、応答時間に悪影響を与えます。

私の質問は、レスポンスの送信を開始する前にサーバー側でファイル全体をダウンロードするのを待つ必要がなく、レスポンスヘッダーを操作できる方法があるかどうかです。

答えて

2

あなたは '応答' イベントにフックすることができます。

const SECRET_HEADERS = ['Set-Cookie', 'X-Special-Token'] 

app.get('/somefile.xml', function (req, res) { 
    request(internalUrl).on('response', function (response) { 
    SECRET_HEADERS.forEach(function (header) { 
     response.removeHeader(header) 
    }) 
    }).pipe(res) 
}) 
+0

ありがとうございました。それが私のトリックでした。データがストリームで利用可能になったとき、またはすべてのhttpデータが削除サーバーからロードされたときに、 'response'イベントが発生したかどうか知っていますか?私はストリームの仕組みや、これが「データ」イベントとはどのように違うのかを理解しようとしています。 – codneto

+0

@codnetoヘッダーとHTTPステータスが受信された後で、 'data'イベントが発生する前に 'response'イベントが発生します。 – idbehold

関連する問題