18

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

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

res.send(text)コールバックで実行しようとすると、

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

socket.close()そして、Express.js が明示的または同類の何かをサポートしているようには見えません。

ここに例があります、

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()完了を意味する呼び出しまで、行ごとに「GOT A ROW」を送信することを期待します。

4

1 に答える 1

50

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();
  });
});

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

于 2013-09-17T19:01:48.483 に答える