Express.js是否支持发送无缓冲的逐步刷新响应?

Eva*_*oll 15 catalyst node.js express

Perl的Catalyst框架允许您通过打开的连接发送逐步刷新的响应.例如,您可以write_fh()在Catalyst :: Response上使用.我已经开始使用Node.js,我找不到如何做等效的.

如果我想发送一个大的CSV文件,大约200兆的有没有办法做到这一点,而无需缓冲内存中的整个CSV文件?当然,如果你不在一定的时间内发送数据,客户端将会超时,所以如果承诺会很好 - 但无论如何都要做到这一点?

当我尝试res.send(text)在回调中做一个时,我得到了

Express
500 Error: This socket has been ended by the other party
Run Code Online (Sandbox Code Playgroud)

并且,Express.js似乎不支持显式socket.close()或类似的东西.

这是一个例子,

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

我期望为每行发送"GOT A ROW",直到client.end()表示完成的呼叫.

hex*_*ide 43

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

你不能res.send()在Express中使用流的方法是因为它将res.close()自动为你使用.