2017-07-18 5 views
0

APIからデータを正常に受信するノードに取得リクエストがあります。ファイルへのノード要求の書き込みが壊れています

このようなファイルに直接応答を送ると、作成されたファイルは有効で読み取り可能なpdfです(APIから受け取ることを期待しています)。シンプル

var http = require('request'); 
var fs = require('fs'); 

http.get(
{ 
    url:'', 
    headers:{} 
}) 
.pipe(fs.createWriteStream('./report.pdf')); 

、私は、このファイルの書き込みのすべての方法を試してみましたが、それは常に完全に空白PDFで終わるこの

http.get(
{ 
    url:'', 
    headers:{} 
}) 
.on('error', function (err) { 
    console.log(err); 
}) 
.on('data', function(data) { 
    file += data; 
}) 
.on('end', function() { 
    var stream = fs.createWriteStream('./report.pdf'); 
    stream.write(file, function() { 
     stream.end(); 
    }); 
}); 

のような要求のイベントエミッタを使用する場合は、ファイルが壊れてしまいました - pdfが有効である唯一の時間はpipeメソッドです。

イベントログにイベントが記録されると、シーケンスが正しいと思われます。つまり、すべてのチャンクが受信され、最後にendが発生します。

パイプの後に何かをすることは不可能です。 writestreamとパイプの違いは何ですか?

答えて

4

file += data; 

ただし、これはim (UTF-8でエンコードされた)文字列に変換します。データがPDFと同様に実際にバイナリである場合、出力データは無効になります。

代わりに、あなたがBufferインスタンスであるdataチャンクを、収集し、一つの大きな(バイナリ)のバッファにすべてのこれらのバッファを連結するBuffer.concat()を使用したい:

var file = []; 
... 
.on('data', function(data) { 
    file.push(data); 
}) 
.on('end', function() { 
    file = Buffer.concat(file); 
    ... 
}); 
+0

uが私はそれをやっていた方法だと思いますか実際にはレスポンスがutf8であっても、文字列を使用することは問題になりますか? – yoyoma

+1

@yoyoma PDFにはバイナリデータが含まれている可能性がありますが、完全に100%UTF-8でエンコードされているわけではありません(PDFの_text_は可能ですが、PDF内にはたくさんのものがあります)。 – robertklep

+0

thxたくさんこれは正しく働いていたものです - 以前はいろいろなバッファを試しましたが、正しく連結したとは思いません – yoyoma

1

ファイルがパイプで書き込まれた後に何かを実行する場合は、pipeによって返されたオブジェクトにfinishのイベントリスナーを追加できます。

.pipe(fs.createWriteStream('./report.pdf')) 
.on('finish', function done() { /* the file has been written */ }); 

出典:

var file = ''; 

次に、あなたのdataハンドラでは、あなたがそれにデータの新しいチャンクを追加します:私はあなたが文字列としてfileを初期化することを前提としていhttps://nodejs.org/api/stream.html#stream_event_finish

関連する問題