2017-08-30 9 views
0

を処理される前に、私は次のコードでのファイルからデータを読み戻すnodejs機能を行おうとしています終了:リクエストはreadstreamイベントが

app.post('/DownloadData', function(req, res) 
{ 
    req.on('data', function(data) { 
     if (fs.existsSync('demoDataFile.dat')) { 
      var rstream = fs.createReadStream('demoDataFile.dat'); 
      var bufs = []; 
      rstream.on('data', function(chunk) { 
       bufs.push(chunk); 
       console.log("data"); 
      }); 
      rstream.on('end', function() { 
       downbuf = Buffer.concat(bufs); 
       console.log(downbuf.length); 
      }); 
     } 
    }); 
    req.on('end', function() { 
     console.log("end length: " + downbuf.length); 
     res.end(downbuf); 
    }); 
    req.on('error', function(err) 
    { 
     console.error(err.stack); 
    }); 
}); 

問題があり、バッファは同じくらい空戻ってきますreq.on( 'end' ...はrstream.onイベントの前に呼び出されます( "data"と長さは "end length:"が出力されるまでコンソールに表示されません)。イベントが間違っている、またはその他の問題がありますか?

+0

'req'とは何ですか?そして 'req'で何か他のコードが何かしていますか? –

+0

申し訳ありません。上記コードスニペットを上記のように修正します –

+0

スニペットを削除しました。スニペットは** runnable ** - ブラウザ内コード用です。私は再びそれを削除するにはオフです。コードブロックにはコードブロックを使用してください。 –

答えて

-1

reqから読んでいる理由はわかりません。ボディーデータをまったく使用していないためです。イベントが複数回トリガされる可能性があります。ファイルを読み込むために使用しているコードも複数回呼び出される可能性があります。ここで

は、私はあなたが欲しいと思うものです:

app.post("/DownloadData", function(req, res) { 
    let stream = fs.createReadStream("demoDataFile.dat"); 

    // Handle error regarding to creating/opening the file stream. 
    stream.on('error', function(err) { 
    console.error(err.stack); 
    res.sendStatus(500); 
    }); 

    // Read the file data into memory. 
    let bufs = []; 
    stream.on("data", function(chunk) { 
    bufs.push(chunk); 
    console.log("data"); 
    }).on("end", function() { 
    let downbuf = Buffer.concat(bufs); 
    console.log(downbuf.length); 

    ...process the buffer... 

    res.end(downbuf); 
    }); 
}); 

あなたは、これは完全にファイルをメモリに読み込みますことを認識する必要があります。大きなファイルの場合は、大量のメモリが必要になることがあります。

ファイルデータに対して実行する操作を指定していないため、代替方法はお勧めできませんが、ファイルデータをストリーミング形式で処理するのに役立つさまざまなモジュールがありますファイルを完全にメモリに読み込む)。

関連する問題