我正在尝试使用自定义流从我的服务器向浏览器传输大量数据。基本上当用户请求文件下载时,我们不知道日志记录服务器上有多少数据,因此我们的服务器通过一次又一次地查询日志记录服务器来获取数据,直到没有更多记录,然后管道它到文件中的浏览器。
这是我们正在做的简化版本:
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-disposition', 'attachment;filename=myfile.csv');
function MyStream() {
var rs = new Readable();
var hitsadded = 0;
rs._read = function() {}; // needed to avoid "Not implemented" exception
getResults(queryString, function getMoreUntilDone(err, res) {
if (err){
logger.logError(err);
//NEED A WAY HERE TO KILL FILE DOWNLOAD WITH ERROR ON BROWSER
}
rs.push(res.data);
hitsadded += res.records;
if (res.recordsTotal > hitsadded) {
getNextPage(query, getMoreUntilDone);
} else {
rs.push(null);
}
});
return rs;
}
MyStream().pipe(zlib.createGzip()).pipe(res);
这有效,但问题是如何处理中间错误。所以浏览器已经启动了文件下载和文件块的一半,让我们说日志记录服务器出现故障。我的服务器捕获了错误,但是我尝试结束流的每一种方式都会导致浏览器出现,好像下载完成没有问题。
我需要浏览器清楚地显示下载失败,我们如何才能执行此操作,因为已经发送了res标头,此时已经收到了200欧元?
我试图用拖车没有运气。当我们发现错误时,我确实尝试了res.socket.destroy,但是这只会在Chrome中出现网络错误而导致下载失败。 IE和Firefox等其他浏览器继续显示下载已完成而没有问题。