Express.js 是否支持发送无缓冲的渐进式刷新响应?

2024-03-26

Perl 的 Catalyst 框架允许您通过开放连接发送渐进刷新的响应。例如你可以使用write_fh()关于催化剂::响应 https://metacpan.org/module/Catalyst%3a%3aResponse#res-write_fh。我已经开始使用 Node.js,但我找不到如何做等效的事情。

如果我想发送一个大约 200 兆的大 CSV 文件,有没有办法在不将整个 CSV 文件缓冲在内存中的情况下做到这一点?诚然,如果您没有在一定时间内发送数据,客户端就会超时,因此如果有一个承诺会很好,但是有办法做到这一点吗?

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

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()表示完成。


Express 构建于原生 HTTP 模块之上,这意味着res是一个实例http.ServerResponse http://nodejs.org/api/http.html#http_class_http_serverresponse,它继承自可写流 http://nodejs.org/api/stream.html#stream_writable_stream界面。也就是说,你可以这样做:

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 for Streams 中的方法是因为它将使用res.close()自动为您服务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Express.js 是否支持发送无缓冲的渐进式刷新响应? 的相关文章

随机推荐