2013-10-25 13 views
13

Node.jsのネイティブhttp.get()を使用して、私はdataendイベントをバインドできるストリームにHTTP応答をパイプしています。Node.js HTTP応答ストリーム

私が現在使用して、gzipのデータのためにこれを取り扱いしています:

http.get(url, function(res) { 
    if (res.headers['content-encoding'] == 'gzip') { 
    res.pipe(gunzip); 
    gunzip.on('data', dataCallback); 
    gunzip.on('end', endCallback); 
    } 
}); 

Gunzipのは、ストリームであり、これだけで動作します。私はストリームを作成しようとしました(ストリームを書き、その後ストリームを読み込みます)、応答をパイプしますが、あまり運がなかった。 gzipで圧縮されていないコンテンツの場合、この同じ取引を複製するための提案はありますか?

+0

私は応答本体を取得しようとしています。私は 'res.on( 'data')'をすることができると思ったが、それは決して引き金になるようなことではない。 – dzm

答えて

20

HTTP要求からの応答オブジェクトは、読み取り可能なストリームのインスタンスです。したがって、dataイベントでデータを収集し、endイベントが発生したときに使用します。

var http = require('http'); 
var body = ''; 

http.get(url, function(res) { 
    res.on('data', function(chunk) { 
    body += chunk; 
    }); 
    res.on('end', function() { 
    // all data has been downloaded 
    }); 
}); 

例でbodyは、上記の書き込み可能なストリームであればreadable.pipe(dest)は基本的に、同じことをするだろう。

+1

Doh、それはリダイレクトに続くhttpが原因であることが判明しました。あなたのコードは私が持っているもので、リダイレクトを除いてうまくいきます。私はnpm 'follow-redirects'をチェックアウトしてテストします。 – dzm

+0

また、リダイレクトに続いて一般的な 'request'モジュールを試すこともできます – vkurchatkin

+0

@vkurchatkin' request'はgzipされたコンテンツをサポートしています – dzm

関連する問題