NodeJS:如何使用 Express 将 'aggregation'(cursor) 对象转换为 CSV 和 return 来自请求的 CSV 响应?
NodeJS: How to convert 'aggregation'(cursor) object to CSV and return a CSV response from a request using Express?
我想将聚合结果转换为 csv。在下面的代码(或伪代码)中,聚合结果存储在变量 cursor
中
我想 return 一个 csv 作为响应 ( res.send(csv)
)。我必须使用 res.set('Content-Type', 'content-type: text/csv')
吗?
下面的代码混合了 NodeJs 和伪代码。函数 covert_to_csv
表示我对该主题一无所知。
const express = require('express')
const app = express();
app.get('/', (req, res) => {
let agg=[ /* a query in MongoDB */]
MongoClient.connect(URL,(err, client) => {
res.set('Content-Type', 'content-type: text/csv');
let collection = client.db('db').collection('col')
let cursor = collection.aggregate(agg)
let csv_file = covert_to_csv(cursor)
csv_file.toArray((error, result) => {
res.send(result);
});
});
app.listen(port, () => console.log(`listening on port ${port}!`));
编辑:
在我的原始代码中,我在 json.I 运行 中收到以下代码的响应:
let agg=[ /* a query in MongoDB */]
let cursor = collection.aggregate(agg)
cursor.toArray((error, result) => {
if(error) {
return res.status(500).send(error);
res.send(result);
我在 JSON 收到邮递员的回复:
[
{
"Source": "entso-e",
"Dataset": "ActualTotalLoad",
"AreaName": "Germany",
"AreaTypeCode": "CTY",
"MapCode": "DE",
"ResolutionCode": "PT15M",
"Year": "2018",
"Month": "1",
"Day": "2",
"DateTimeUTC": "2018-01-02 00:00:00.0000000",
"ActualTotalLoadValue": "41412.38",
"UpdateTimeUTC": "2018-01-02 13:16:19.0000000"
},
{
"Source": "entso-e",
"Dataset": "ActualTotalLoad",
"AreaName": "Germany",
"AreaTypeCode": "CTY",
"MapCode": "DE",
"ResolutionCode": "PT15M",
"Year": "2018",
"Month": "1",
"Day": "2",
"DateTimeUTC": "2018-01-02 00:45:00.0000000",
"ActualTotalLoadValue": "40785.17",
"UpdateTimeUTC": "2018-01-02 13:16:19.0000000"
},
..... (more documents)
]
您可以使用像 json2csv
这样的模块来完成这项工作。你的例子看起来像这样
const { Parser } = require('json2csv');
app.get('/', function(req, res) {
let agg = [/* mongo aggregation */]
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=\"' + 'download-' + Date.now() + '.csv\"');
let cursor = collection.aggregate(agg)
const fields = ['Source', 'Dataset', 'Areaname'];//all your field names
const json2csvParser = new Parser({ fields });
cursor.toArray((error, result) => {
res.send(json2csvParser.parse(result))
})
})
尝试参考 https://www.npmjs.com/package/fast-csv 并将 keys as header 选项设置为 true
我想将聚合结果转换为 csv。在下面的代码(或伪代码)中,聚合结果存储在变量 cursor
中我想 return 一个 csv 作为响应 ( res.send(csv)
)。我必须使用 res.set('Content-Type', 'content-type: text/csv')
吗?
下面的代码混合了 NodeJs 和伪代码。函数 covert_to_csv
表示我对该主题一无所知。
const express = require('express')
const app = express();
app.get('/', (req, res) => {
let agg=[ /* a query in MongoDB */]
MongoClient.connect(URL,(err, client) => {
res.set('Content-Type', 'content-type: text/csv');
let collection = client.db('db').collection('col')
let cursor = collection.aggregate(agg)
let csv_file = covert_to_csv(cursor)
csv_file.toArray((error, result) => {
res.send(result);
});
});
app.listen(port, () => console.log(`listening on port ${port}!`));
编辑:
在我的原始代码中,我在 json.I 运行 中收到以下代码的响应:
let agg=[ /* a query in MongoDB */]
let cursor = collection.aggregate(agg)
cursor.toArray((error, result) => {
if(error) {
return res.status(500).send(error);
res.send(result);
我在 JSON 收到邮递员的回复:
[
{
"Source": "entso-e",
"Dataset": "ActualTotalLoad",
"AreaName": "Germany",
"AreaTypeCode": "CTY",
"MapCode": "DE",
"ResolutionCode": "PT15M",
"Year": "2018",
"Month": "1",
"Day": "2",
"DateTimeUTC": "2018-01-02 00:00:00.0000000",
"ActualTotalLoadValue": "41412.38",
"UpdateTimeUTC": "2018-01-02 13:16:19.0000000"
},
{
"Source": "entso-e",
"Dataset": "ActualTotalLoad",
"AreaName": "Germany",
"AreaTypeCode": "CTY",
"MapCode": "DE",
"ResolutionCode": "PT15M",
"Year": "2018",
"Month": "1",
"Day": "2",
"DateTimeUTC": "2018-01-02 00:45:00.0000000",
"ActualTotalLoadValue": "40785.17",
"UpdateTimeUTC": "2018-01-02 13:16:19.0000000"
},
..... (more documents)
]
您可以使用像 json2csv
这样的模块来完成这项工作。你的例子看起来像这样
const { Parser } = require('json2csv');
app.get('/', function(req, res) {
let agg = [/* mongo aggregation */]
res.setHeader('Content-Type', 'text/csv');
res.setHeader('Content-Disposition', 'attachment; filename=\"' + 'download-' + Date.now() + '.csv\"');
let cursor = collection.aggregate(agg)
const fields = ['Source', 'Dataset', 'Areaname'];//all your field names
const json2csvParser = new Parser({ fields });
cursor.toArray((error, result) => {
res.send(json2csvParser.parse(result))
})
})
尝试参考 https://www.npmjs.com/package/fast-csv 并将 keys as header 选项设置为 true