How do I stream response in express? How do I stream response in express? express express

How do I stream response in express?


You don't need a readable stream instance, just use 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();

This works because in Express, res is based on Node's own http.serverResponse, so it inherits all its methods (like write).


I was able to get this to work.

...

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


I needed to stream a response in express in order to work with tar-stream. Here is how I did it in case it helps anyone.

The requests are for a single file from a tar file stored on the server.

const fs = require("fs"),   tar = require("tar-stream");app.get("/fileFromTar/*", (req, res) => {   const fileWanted = req.params[0],      readStream = fs.createReadStream('myTarFile.tar'),      extractor = tar.extract();   extractor.on('entry', (header, stream, next) => {      stream.on('end', next);      if (header.name === fileWanted) {         const { size } = header;         res.set({           "Content-Type": 'audio/flac', // or whichever one applies           "Content-Length": size,           "Content-Range": `bytes 0-${size}/${size}`         });         stream.pipe(res);      }      else stream.resume();   });   readStream.pipe(extractor);});