我正在使用这个ExpressJS代码。我的应用程序发送一个_id的数组,我搜索并从mongo中获取。然后我尝试生成返回数据的CSV。以下代码按预期工作。它正在将CSV写入我的应用程序的根目录。我想要进行的修改是我希望将文件下载到用户计算机。我一直在谷歌搜索这个主题很长一段时间,每个人都说为了下载文件你需要使用fs.createWriteStream
或res.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。
答案 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);