Ошибка загрузки потокового файла 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")
        }
    });
}

0 ответов

Другие вопросы по тегам