NodeJS: Как преобразовать объект агрегации (курсор) в CSV и вернуть ответ CSV на запрос, используя Express? - PullRequest
1 голос
/ 09 января 2020

Я хочу преобразовать результат из агрегата в CSV. В приведенном ниже коде (или псевдокоде) результаты агрегата сохраняются в переменной курсор

Я хочу вернуть 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. Я запускаю следующий код:

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

Ответы [ 2 ]

4 голосов
/ 12 января 2020

Вы можете использовать такой модуль, как 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))

    })
})
1 голос
/ 14 января 2020

Попробуйте обратиться к https://www.npmjs.com/package/fast-csv и установите ключи в качестве опции заголовка в true

...