我如何在快递中传输响应

Ami*_*ari 13 javascript csv node.js express

我一直在尝试使用快速应用程序将响应作为流发送.

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);
});      
Run Code Online (Sandbox Code Playgroud)

当我用"rs.pipe(process.stdout)"替换"rs.pipe(res)"时,它会在控制台中打印,但是如何使它在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);"
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 20

您不需要可读的流实例,只需使用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();
Run Code Online (Sandbox Code Playgroud)

这有效,因为在Express中,res它基于Node自己http.serverResponse,所以它继承了它的所有方法(比如write).

  • 在调用 res.end() 之前,这不会流、缓冲 (6认同)
  • @chetandev 你的浏览器/客户端可能会缓冲它,但 Express 或 `http` 不会。您可以使用非缓冲 TCP 客户端(例如“nc/netcat”)对此进行测试。请参阅[此要点](https://gist.github.com/robertklep/93fb9122a20e4acacc44161fbacca496)。 (4认同)
  • 不,因为`res`也是一个流。 (2认同)

Jer*_*nes 9

我需要以 Express 方式传输响应才能使用 tar-stream。这是我的做法,以防对任何人有帮助。

这些请求针对存储在服务器上的 tar 文件中的单个文件。

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);
});
Run Code Online (Sandbox Code Playgroud)


Sag*_*gan 5

我能够让这个工作。

...

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)
  };
};
Run Code Online (Sandbox Code Playgroud)