Ошибка загрузки потокового файла NodeJS в медленных сетях
У меня есть следующее downloadFile()
функция, которая использует elasticsearch-js
плагин для выполнения scan & scroll
операция на elasticsearch
и записать его содержимое в потоковый файл CSV, используя ya-csv
плагин.
Отрывки кода, используемые для чтения данных из elasticsearch
непосредственно из документов с некоторыми незначительными изменениями.
Проблема: у этой функции нет проблем с загрузкой файлов 600 mb
в более быстрой сети без прокси. Тем не менее, я видел, что это действительно плохо, когда я пытаюсь получить доступ к нему через внутренний прокси. Прокси, однако, похоже, работает для других пользователей, которые скачивают gigs
файлов поверх него каждый день без проблем.
Я просто хотел посмотреть, сможет ли кто-нибудь заметить в коде что-нибудь, что может привести к сбою при проблемах с задержкой и так далее.
function downloadFile(req, downloadResponse) {
var datetime = (new Date).getTime();
var filename = "datafile_" + datetime + '.csv'
var csv = require('ya-csv')
downloadResponse.setHeader('Content-Type', 'application/octet-stream');
downloadResponse.setHeader('Content-disposition', 'attachment;filename=' + filename);
var writer = csv.createCsvStreamWriter(downloadResponse);
writer.writeRecord(csvExportHeaders)
// first we do a search, and specify a scroll timeout
var esRecordCounter = 0;
var client = new elasticsearch.Client({
host: ELASTICSEARCH_URL,
requestTimeout: 1000 * 60 * 60,
log: 'error',
httpAuth: ES_USER + ':' + ES_PASS
});
var scrollID = 0;
var hits = 0;
var start = new Date()
client.search({
index: ES_INDEX,
type: 'blog',
scroll: '5m',
size: 10000,
body: queryBody,
timeout: '2m'
}, function getMoreUntilDone(error, response) {
if (response) {
if (response.hits) {
var end = new Date() - start;
hits = response.hits.total;
scrollID = response._scroll_id
took_time = response.took
response.hits.hits.forEach(function (hit) {
writer.writeRecord([
hit._source.name,
hit._source.age,
hit._source.gender,
hit._source.address,
hit._source.email
])
esRecordCounter++;
});
console.log("Hits => " + hits + " and recordCounter => " + esRecordCounter + " in " + end + " and took " + took_time);
}
} else {
var end = new Date() - start;
console.log("Undefined => " + hits + " and recordCounter => " + esRecordCounter+ " in " + end );
console.log(JSON.stringify(response));
}
if (hits !== esRecordCounter) {
// now we can call scroll over and over
start = new Date()
client.scroll({
scrollId: scrollID,
scroll: '5m'
}, getMoreUntilDone);
} else {
console.log("Scan & Scroll complete since Hits = " + hits + " and recordCounter = " + esRecordCounter);
downloadResponse.end()
console.log("File " + filename + " was successfully downloaded")
}
});
}