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);