web-dev-qa-db-ja.com

エクスプレスで応答をストリーミングする方法

応答をストリームとして送信するエクスプレスアプリを取得しようとしています。

var Readable = require('stream').Readable;
var rs = Readable();


app.get('/report', function(req,res) {

    res.statusCode = 200;
    res.setHeader('Content-type', 'application/csv');
    res.setHeader('Access-Control-Allow-Origin', '*');

    // Header to force download
    res.setHeader('Content-disposition', 'attachment; filename=Report.csv');


    rs.pipe(res);

    rs.Push("USERID,NAME,FBID,ACCOUNT,SUBSCRIPTION,PRICE,STATE,TIMEPERIOD\n");

    for (var i = 0; i < 10; i++) {
        rs.Push("23,John Doe,1234,500,SUBSCRIPITON,100,ACTIVE,30\n");
    }

    rs.Push(null);
});      

「rs.pipe(res)」を「rs.pipe(process.stdout)」に置き換えると、コンソールで印刷されますが、エクスプレスアプリで動作させる方法です。

Error: not implemented
    at Readable._read (_stream_readable.js:465:22)
    at Readable.read (_stream_readable.js:341:10)
    at Readable.on (_stream_readable.js:720:14)
    at Readable.pipe (_stream_readable.js:575:10)
    at line "rs.pipe(res);"
13
Amit Adhikari

読み取り可能なストリームインスタンスは必要ありません。res.write()を使用するだけです。

res.write("USERID,NAME,FBID,ACCOUNT,SUBSCRIPTION,PRICE,STATE,TIMEPERIOD\n");

for (var i = 0; i < 10; i++) {
    res.write("23,John Doe,1234,500,SUBSCRIPITON,100,ACTIVE,30\n");
}

res.end();

これは、Expressではresがノード独自の http.serverResponse 。したがって、すべてのメソッドを継承します( write など)。

19
robertklep

これを機能させることができました。

...

router.get('/stream', function (req, res, next) {
  //when using text/plain it did not stream
  //without charset=utf-8, it only worked in Chrome, not Firefox
  res.setHeader('Content-Type', 'text/html; charset=utf-8');
  res.setHeader('Transfer-Encoding', 'chunked');

  res.write("Thinking...");
  sendAndSleep(res, 1);
});


var sendAndSleep = function (response, counter) {
  if (counter > 10) {
    response.end();
  } else {
    response.write(" ;i=" + counter);
    counter++;
    setTimeout(function () {
      sendAndSleep(response, counter);
    }, 1000)
  };
};
0
Sagan