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(使用前将#替换为@)