J'ai essayé d'obtenir une application express pour envoyer la réponse sous forme de flux.
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);
});
Il s'imprime dans la console lorsque je remplace "rs.pipe (res)" par "rs.pipe (process.stdout)" mais comment le faire fonctionner dans l'application express.
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);"
Vous n'avez pas besoin d'une instance de flux lisible, utilisez simplement 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();
Cela fonctionne parce que dans Express, res
est basé sur le propre Node http.serverResponse
, donc il hérite de toutes ses méthodes (comme write
).
J'ai pu faire fonctionner cela.
...
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)
};
};