Загрузите файл csv из Backend

Я пытаюсь создать файл csv, вставить свои данные и загрузить их из браузера. Я создаю файл csv в backend-файле express js и отправляю ссылку, чтобы реагировать на js-интерфейс для загрузки через браузер.

Я использую быстрый плагин csv для записи данных в csv. Вот мой код.

async function dataToCSV(data) {
    var fileName = "report.csv";
    var ws = await fileSystem.createWriteStream('../' + fileName);
    var csv;
    await fastcsv.write(data, { headers: true }).on("finish", function () {
        console.info(ws);
        csv = "<a href='../report.csv' download='report.csv' id='download-link'></a>";
    }).pipe(ws);
    return csv;
}

Получив результат этого метода, я отправляю его во внешний интерфейс.

return dataToCSV(jsonData).then((response) => {
            return {
                headers,
                statusCode: 200,
                body: response,
                type: 'binary'
            };
        }).catch((e) => {
            return {
                headers,
                statusCode: 400,
                body: {
                    error: e.message
                }
            };
        })

Передняя часть получит ответ, как указано ниже.

<a href='report.csv' download='report.csv' id='download-link'></a>

Затем я использую следующий код, чтобы загрузить его через браузер с помощью response js.

 var div = document.createElement('div');
 div.innerHTML = response.trim();
 document.body.appendChild(div);
 var downloadLink = document.getElementById('download-link');
 if (downloadLink !== null) {
     downloadLink.click();
 }
 document.body.removeChild(div);

Я могу подтвердить, что файл был создан на сервере. Но когда он загружается из браузера, он терпит неудачу. В логах ошибок нет. Браузер говорит

Failed - No file

Я не могу понять, почему это не удается. Я думаю, что ответ отправляется веб-интерфейсу до создания файла, или он не может определить путь, по которому создается файл. Но я не уверен в этом. Пожалуйста, помогите мне найти решение для этого.

Верните с сервера тег привязки с href = ".. report.csv" !!!! это неверно, вам нужно вернуть полные двоичные данные или полную ссылку на файл

Babak Yaghoobi 31.03.2021 10:28

Вы можете объяснить это поподробнее. Пожалуйста, приведите пример.

Buwaneka Sudheera 31.03.2021 10:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
29
1

Ответы 1

.pipe() не возвращает обещание, поэтому ваш await не выполняет то, что задумано. Если вы хотите дождаться завершения потока с использованием обещаний, см. stream.pipeline.

Возможно, здесь задействованы дополнительные факторы - например, ваш обработчик HTTP не похож на обработчик express (даже если ваш вопрос включает тег «express»). Если это бессерверная функция (AWS Lambda?), Вам может потребоваться изменить свою стратегию; в зависимости от платформы функции могут не обслуживать файлы.

В любом случае было бы лучше создать CSV-файл и отправить его напрямую клиенту без записи в файловую систему, используя потоки (хотя это, похоже, невозможно в Node на AWS Lambda). В противном случае всегда можно передать файл в облачное хранилище и предоставить клиенту предварительно подписанный URL.

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