Загрузите CSV-файл из браузера после выполнения вызова axios из Api React to Nodejs

#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'); });