ExpressJS JSON到CSV

时间:2015-08-26 19:16:10

标签: node.js express

我正在使用这个ExpressJS代码。我的应用程序发送一个_id的数组,我搜索并从mongo中获取。然后我尝试生成返回数据的CSV。以下代码按预期工作。它正在将CSV写入我的应用程序的根目录。我想要进行的修改是我希望将文件下载到用户计算机。我一直在谷歌搜索这个主题很长一段时间,每个人都说为了下载文件你需要使用fs.createWriteStreamres.download()但是我不知道如何使用我当前的方法结构来实现它。显然,在创建csv之后,它需要在json2csv()内部发生。我宁愿不必写文件,流,然后删除。我喜欢它,如果我可以直接流。

我使用的json2csv包在这里: https://www.npmjs.com/package/json2csv

router.post('/Equipment/Report', function(req, res, next) {
    var filteredData = req.body;
    console.log(filteredData);
    Equipment.find({_id: { $in: filteredData }}, function(err, Equipment) {
        console.log(Equipment);
        var fields = ['ClassPrefix', 'UnitNumber'];
        json2csv({ data: Equipment, fields: fields}, function(err, csv) {
            if (err) console.log(err);
            fs.writeFile('file.csv', csv, function(err) {
                if (err) throw err;
                console.log('file saved');
            });
        });
    });
    //console.log(filteredData);
});

编辑建议代码 -

router.post('/Equipment/Report', function(req, res, next) {
    var filteredData = req.body;
    console.log(filteredData);
    Equipment.find({_id: { $in: filteredData }}, function(err, Equipment) {
        console.log(Equipment);
        var fields = ['ClassPrefix', 'UnitNumber'];
        json2csv({ data: Equipment, fields: fields}, function(err, csv) {
            if (err) console.log(err);
            console.log(csv);
            res.attachment('data.csv');
            res.send(csv);
        });
    });
});

这不会下载任何文件。 记录响应为200。

2 个答案:

答案 0 :(得分:2)

我认为,您想在浏览器上下载csv文件,因此,您无需在服务器端创建文件。

您需要正确设置响应内容类型,以便浏览器将其视为可下载链接。

json2csv({ data: Equipment, fields: fields}, function(err, csvStr) {
  if (err) {
    console.log(err);
    res.statusCode = 500;
    return res.end(err.message);
  }
  res.header("Content-Disposition",attachment;filename=data.csv"); 
  res.type("text/csv");
  res.send(200, csvStr);
})

答案 1 :(得分:0)

这是您可以在客户端执行的操作。您应该将数据发送到客户端并让浏览器在客户端浏览器上下载 csv 文件。

//Inside your server router
json2csv({ data: Equipment, fields: fields}, function(err, csv) {
  if (err) {
    next(err);
  }
      res.setHeader('Content-disposition', 'attachment; filename=data.csv');
      res.set('Content-Type', 'text/csv');
      res.send(csv);
});

在客户端,让浏览器下载它。

window.open(requestedUrl);