web-dev-qa-db-ja.com

Express.jsは、バッファリングされていないプログレッシブフラッシュ応答の送信をサポートしていますか?

PerlのCatalystフレームワークを使用すると、開いている接続を介して段階的にフラッシュされる応答を送信できます。たとえば、Catalyst :: Responseで write_fh()を使用できます 。 Node.jsを使い始めましたが、同等の方法が見つかりません。

大きなCSVファイルを送信したい場合、200メガバイト程度で、CSVファイル全体をメモリにバッファリングせずに送信する方法はありますか?確かに、一定の時間内にデータを送信しないとクライアントはタイムアウトするので、もしそうなら約束はいいでしょう-しかし、とにかくこれを行う方法はありますか?

コールバックでres.send(text)を実行しようとすると、次のようになります。

_Express
500 Error: This socket has been ended by the other party
_

また、Express.jsが明示的なsocket.close()やその他の機能をサポートしているようには見えません。

これが例です、

_exports.foo = function (res) {                          
  var query = client.query("SELECT * FROM naics.codes");
  query.on('row', function(row) {                       
    //console.log(row);                                 
    res.write("GOT A ROW");                             
  });                                                   
  query.on('end', function() {                          
    res.end();                                          
    client.end();                                       
  });                                                   
};                                                      
_

client.end()の呼び出しが完了を意味するまで、各行に「GOTAROW」を送信することを期待します。

16
Evan Carroll

ExpressはネイティブHTTPモジュール上に構築されています。つまり、res_http.ServerResponse_ のインスタンスであり、 書き込み可能なストリーム インターフェイスから継承します。そうは言っても、あなたはこれを行うことができます:

_app.get('/', function(req, res) {
  var stream = fs.createReadStream('./file.csv');
  stream.pipe(res);

  // or use event handlers
  stream.on('data', function(data) {
    res.write(data);
  });

  stream.on('end', function() {
    res.end();
  });
});
_

Expressでストリームにres.send()メソッドを使用できない理由は、res.close()が自動的に使用されるためです。

45
hexacyanide