一尘不染

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

node.js

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

如果我要发送一个较大的CSV文件,是否可以在不将整个CSV文件缓存在内存中的情况下实现200兆的数量级?当然,如果您在一定时间内不发送数据,客户端将超时,因此,如果-
但有什么办法做到这一点,诺言将是不错的选择?

当我尝试res.send(text)在回调中执行a 时,我得到

Express
500 Error: This socket has been ended by the other party

而且,似乎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();                                       
  });                                                   
};

我希望为此在每一行发送“ GOT A ROW”,直到调用client.end()完成为止。


阅读 250

收藏
2020-07-07

共1个答案

一尘不染

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

您无法res.send()在Express 中将方法用于流的原因是因为它将res.close()自动为您使用。

2020-07-07