【问题标题】:Does Express.js support sending unbuffered progressively flushed responses?Express.js 是否支持发送无缓冲的渐进式刷新响应?
【发布时间】:2013-09-22 08:30:42
【问题描述】:

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

如果我想发送一个大的 CSV 文件,大约 200 兆,有没有办法做到这一点,而无需在内存中缓冲整个 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() 表示完成。

【问题讨论】:

  • 你是如何使用导出的?您从该导出中获得了什么结果?
  • Export 位于由路由调用的模型中。好像它没有得到我发送给 foo() 的 res 的副本,不知道是线程错误还是下面的什么。
  • exports.foofunction(res) 更改为 function(req, res)。您传递的是请求而不是响应。
  • @hexacyanide 没有区别,我只是从路线发送它。这段代码来自我保存 SQL 的数据库接口。我实际上什至不喜欢发送它res,但我这样做是出于必要。

标签: node.js express catalyst


【解决方案1】:

Express 建立在原生 HTTP 模块之上,这意味着reshttp.ServerResponse 的一个实例,它继承自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();
  });
});

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

【讨论】:

  • 我更新了一个例子。我会尝试你的代码只是为了好玩,但你的想法对我不起作用。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 2012-04-12
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
相关资源
最近更新 更多