#node.js #reactjs #axios
Вопрос:
У меня есть приложение MERN, и я хочу загрузить файл CSV по нажатию кнопки. Я реализовал все, но когда я нажимаю кнопку, в браузере нет загрузки.
Вызов Аксиоса
const handleDownloadCsv = async () =gt; { try { await axios.get('http://localhost:2000/users/admin-panel/csv'); } catch (error) { console.log(error); } };
Контроллер NodeJS
export const admin_panel_csv = async (req,res) =gt; { try { let __dirname = res.locals.__dirname; const myReadStream = fs.createReadStream(__dirname '/documents/admin_csv.csv'); //myReadStream.pipe(res); res.download(__dirname '/documents/admin_csv.csv') } catch (error) { console.log('Error csv: ',error.message); res.status(400).json({msg:error.message}); } }
Я пробовал как createReadStream(с каналом), так и res.download(путь к файлу), но ни один из них не работает. Я не получаю никаких ошибок при выполнении этого вызова api через axios. Есть ли какой-то способ сделать это без использования библиотек React.
Комментарии:
1. Похоже, нет причин для
admin_panel_csv
асинхронности. Это просто вернет обещание.
Ответ №1:
В браузере нет запроса на загрузку, так как вы инициируете загрузку через axios
, а не через браузер (например, через lt;formgt;
СООБЩЕНИЕ или lt;agt;
щелчок).
Измените исходный код обратно на res.download
исходный код и на интерфейсе, инициируйте загрузку одним lt;agt;
щелчком мыши:
const handleDownloadCsv = () =gt; { const tempLink = document.createElement('a') tempLink.href = 'http://localhost:2000/users/admin-panel/csv' tempLink.click() }
Ответ №2:
Я думаю, что вы должны использовать js-файл-загрузку в React и просто :
const FileDownload = require('js-file-download'); Axios.get(API_URL "download") .then((response) =gt; { FileDownload(response.data, 'file.txt'); });