Download csv file node.js
I am building an app using node.js and trying to download data as a csv file. I am using json2csv (https://www.npmjs.com/package/json2csv) for this purpose. However, the way I have it configured, the .csv file gets stored in my app's root directory. I want the file to be sent to the user as a download - for example, the file should appear in the user's /downloads
folder. Here is my current code:
var fields = ['car', 'price', 'color'];
var myCars = [
{
"car": "Audi",
"price": 1,
"color": "blue"
}, {
"car": "BMW",
"price": 1,
"color": "black"
}, {
"car": "Porsche",
"price": 1,
"color": "green"
}
];
json2csv({ data: myCars, fields: fields }, function(err, csv) {
if (err) console.log(err);
fs.writeFile('file.csv', csv, function(err) { //currently saves file to app's root directory
if (err) throw err;
console.log('file saved');
});
});
var file = '../software-project-metric-dashboard/file.csv';
res.download(file, 'testfile.csv');
Can someone help?
Thanks!
Solution 1:
Use res.send if you use express.
You have to define a HTTP GET route which looks something like that:
app.get("/pathToYourDownload", function (req, res) {
json2csv({ data: myCars, fields: fields }, function(err, csv) {
res.setHeader('Content-disposition', 'attachment; filename=data.csv');
res.set('Content-Type', 'text/csv');
res.status(200).send(csv);
});
});
Solution 2:
On express server:
const json2csv = require('json2csv').parse;
const csvString = json2csv(yourDataAsArrayOfObjects);
res.setHeader('Content-disposition', 'attachment; filename=shifts-report.csv');
res.set('Content-Type', 'text/csv');
res.status(200).send(csvString);
On client (otherwise most of the browsers will not download the file, even you will see the proper response in the network panel):
window.open(downloadUrl);