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()
表示完成。
答案 0 :(得分:40)
Express构建在本机HTTP模块上,这意味着res
是http.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()
。