Я пытаюсь создать файл 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
Я не могу понять, почему это не удается. Я думаю, что ответ отправляется веб-интерфейсу до создания файла, или он не может определить путь, по которому создается файл. Но я не уверен в этом. Пожалуйста, помогите мне найти решение для этого.
Вы можете объяснить это поподробнее. Пожалуйста, приведите пример.





.pipe() не возвращает обещание, поэтому ваш await не выполняет то, что задумано. Если вы хотите дождаться завершения потока с использованием обещаний, см. stream.pipeline.
Возможно, здесь задействованы дополнительные факторы - например, ваш обработчик HTTP не похож на обработчик express (даже если ваш вопрос включает тег «express»). Если это бессерверная функция (AWS Lambda?), Вам может потребоваться изменить свою стратегию; в зависимости от платформы функции могут не обслуживать файлы.
В любом случае было бы лучше создать CSV-файл и отправить его напрямую клиенту без записи в файловую систему, используя потоки (хотя это, похоже, невозможно в Node на AWS Lambda). В противном случае всегда можно передать файл в облачное хранилище и предоставить клиенту предварительно подписанный URL.
Верните с сервера тег привязки с href = ".. report.csv" !!!! это неверно, вам нужно вернуть полные двоичные данные или полную ссылку на файл