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