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

18
Perl的Catalyst框架允许您在打开的连接上发送逐渐增加的响应。例如,您可以在Catalyst :: Response上使用write_fh()。我开始使用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()表示完成。

你是如何使用导出功能的?你从导出中得到了什么结果? - hexacyanide
导出功能在被路由调用的模块中。就好像它没有获取我发送给foo()的res副本一样,我想知道这是线程错误还是底层的什么问题。 - Evan Carroll
exports.foofunction(res) 改为 function(req, res)。您正在传递请求而不是响应。 - hexacyanide
@hexacyanide 没有区别,我只是从路由发送它的 res。这段代码来自我保存 SQL 的 db-interface。实际上,我甚至不喜欢发送 res,但出于必要性而这样做。 - Evan Carroll
1个回答

50

Express是基于本地HTTP模块构建的,这意味着reshttp.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();
  });
});

你不能在Express中使用res.send()方法输出流是因为该方法会自动使用res.close()


我更新了一个例子。我会试着运行你的代码,只是为了好玩,但是你的想法对我没用。 - Evan Carroll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接