Подтвердить что ты не робот

Как экспортировать csv nodejs

Привет, я пытаюсь экспортировать csv из node.js(вытаскивание данных из mongodb). У меня уже есть данные, которые вытаскиваются и разделяются запятыми и всеми, но теперь я пытаюсь выяснить, как на самом деле отправить его... Я придерживаюсь этого кода в файле маршрутов. Любые советы о том, как взять массив данных и отправить его пользователю прямо для загрузки по запросу.

вот код: (я попытался выполнить нижнюю часть кода второй функции)

exports.downloadContacts = function(req, res) {
    async.waterfall([
        function(callback) {
            var source = [];
            Friend.find({userId: req.signedCookies.userid}, function(err, friends) {
                if(err) {console.log('err with friends for download');
                } else {
                    var userMap = {};
                    var friendIds = friends.map(function (user) {
                        userMap[user.friend_id] = user;
                        return user.friend_id;
                    });
                    console.log(friends);
                    User.find({_id: {$in: friendIds}}, function(err, users) {
                        if(err) {console.log(err); 
                        } else {
                            for(var i = 0; i < users.length; i++) {
                                console.log('users')
                                //console.log(users[i]);
                                source.push(users[i].firstNameTrue, users[i].lastNameTrue, users[i].emailTrue, users[i].phone, users[i].emailList, users[i].phoneList)
                            }
                            console.log(source);
                            callback(null, source);
                        }


                    });
                }


            });

        }
    ],
    function(err, source) {
        var result = [];

        res.contentType('csv');

        csv()
        .from(source)
        .on('data', function(data){ 
            result.push(data.join());
        })
        .on('end', function(){
            res.send(result.join('\n'));
        });
    });     
};
4b9b3361

Ответ 1

Вы пробовали что-то подобное с типом контента как "application/octet-stream"

res.set('Content-Type', 'application/octet-stream');
res.send(<your data>);

или просто

res.send(Buffer.from(<your data>));

Экспресс отправка() документов.

Ответ 2

Вот что я сделал:

  1. Используйте json2csv для создания CSV-данных из данных Mongodb

var json2csv = require('json2csv');
var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes'];
var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes'];
var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames });
  1. Отправить данные CSV клиенту

res.attachment('filename.csv');
res.status(200).send(data);

Ответ 3

Привет, ребята, основанные на ответе @VierTD, вы должны использовать json2csv для сборки данных csv из данных mongodb.

Обновить пакет .json с dependecies

  "dependencies": {
    "mongodb": "^2.2.10",
    "json2csv": "*",
    "express": "*"
  }

Создайте объект json2CSV, помните, что это сопоставление вашего документа (таблица db), поэтому имена в "полях" должны соответствовать таблице db, имена полей соответствуют вам, но также важны, поскольку это имена столбцов файла CSV

var json2csv = require('json2csv');
var fields = ['name', 'phone', 'mobile', 'email', 'address', 'notes'];
var fieldNames = ['Name', 'Phone', 'Mobile', 'Email', 'Address', 'Notes'];
var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames });

Отправить данные csv клиенту

res.attachment('filename.csv');
res.status(200).send(data);

Этот код показывает, как экспортировать файл csv на основе документа mongo db (таблица базы данных)

Я создал github repo действительно очень короткую выборку идеи, также создал базу данных с фиктивными данными в Веб-сайт Mongo Lab, поэтому этот код будет запущен сразу на вашем компьютере. На вопрос @VietTD ответ!

Если вы заинтересованы в тестировании этого кода, просто не забудьте изменить следующие строки

Измените db url (Пользователь ваш собственный db это работает, но это только для показа целей, D)

        var url = 'mongodb://admin:[email protected]:63946/misale_dev';

Изменить целевой документ (или таблицу db)

var collection = db.collection('_dummy');

Изменить столбцы документов (или поля столбца таблицы db)

var fields = ['_id', 'JobID', 'LastApplied'];

Наконец, укажите имена столбцов заголовков CSV, а также имя вашего CSV файла

var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE'];

И последнее, но не менее важное:

res.attachment('yourfilenamehere.csv');

Пожалуйста, не стесняйтесь улучшать код примера, я буду этому благодарен! или просто загрузите его и посмотрите на код, он уже поставляется с базой данных, поэтому его будет легко понять и запустить, в таком случае вам не нужен весь код, возможно, вы видите что-то интересное:

//
// EXPRESS JS SERVER INITI
//
var express = require('express')
var app = express()

//
// MONGO DB INIT
//
var MongoClient = require('mongodb').MongoClient, assert = require('assert');
app.get('/', function (req, res) {
    var url = 'mongodb://admin:[email protected]:63946/misale_dev';
    //
    // This function should be used for migrating a db table to a TBD format
    //
    var migrateMongoDBTable = function(db, callback) {
        // Get the documents collection
        console.log("Reading database records");
        // Get the documents collection
        var collection = db.collection('_dummy');
        // Find some documents
        //collection.find({'a': 3}).toArray(function(err, docs) {
        collection.find({}).toArray(function(err, docs) {
          assert.equal(err, null);
          //console.log(docs);
          //console.log('docs.length ---> ', docs.length);
          console.log('Creating CSV...');
          //console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=');
          var json2csv = require('json2csv');
          var fields = ['_id', 'JobID', 'LastApplied'];
          var fieldNames = ['ID_OR_PK', 'JOB_UNIQUE_ID_TITLE', 'APPLICATION_DATE'];
          var data = json2csv({ data: docs, fields: fields, fieldNames: fieldNames });
          //console.log('-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=');
          // EXPORT FILE
          res.attachment('yourfilenamehere.csv');
          res.status(200).send(data);
          callback(docs);
        });
    };

    // Use connect method to connect to the server
    MongoClient.connect(url, function(err, db) {
      assert.equal(null, err);
      console.log("Connected successfully to server");
      //
      // migrate db table to some format TBD
      //
      migrateMongoDBTable(db, function() {
        db.close();
      });
    });

})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})
// Connection URL
//var url = 'mongodb://localhost:27017/myproject';

Спасибо!

Ответ 4

Я не совсем уверен, в чем вы сомневаетесь, но я думаю, что то, что вы ищете, можно решить, установив заголовок Content Disposition. Взгляните на этот ответ на другой вопрос SO: fooobar.com/questions/33125/....

Ответ 5

Express-csv - отличный модуль для записи содержимого csv для потока с сервера node.js, который будет отправлен как ответ клиенту (и загружен как файл). Очень прост в использовании.

app.get('/', function(req, res) {
  res.csv([
    ["a", "b", "c"]
  , ["d", "e", "f"]
  ]);
});

Документы: https://www.npmjs.com/package/express-csv

Когда вы передаете объект, вам необходимо заранее добавить заголовки (если хотите). Здесь мой мой пример, используя npm mysql

router.route('/api/report')
    .get(function(req, res) {
            query = connection.query('select * from table where table_id=1;', function(err, rows, fields) {
                if (err) {
                    res.send(err);
                }
                var headers = {};
                for (key in rows[0]) {
                    headers[key] = key;
                }
                rows.unshift(headers);
                res.csv(rows);
            });
    });

Ответ 7

Используя библиотеку json2csv, вы можете экспортировать csv из данных mongodb.

const json2csv = require('json2csv').parse;

//For unique file name
const dateTime = new Date().toISOString().slice(-24).replace(/\D/g, 
'').slice(0, 14); 

const filePath = path.join(__dirname, "../../../", "public", "exports", "csv-" 
+ dateTime + ".csv");

let csv; 

const student = await req.db.collection('Student').find({}).toArray();

// Logging student
// [{id:1,name:"John",country:"USA"},{id:1,name:"Ronny",country:"Germany"}]

const fields = ['id','name','country'];

 try {
    csv = json2csv(booking_info, {fields});
 } catch (err) {
    return res.status(500).json({err});
 }

 fs.writeFile(filePath, csv, function (err) {
    if (err) {
        return res.json(err).status(500);
    }
    else {
        setTimeout(function () {
            fs.unlink(filePath, function (err) { // delete file after 30 sec
            if (err) {
                console.error(err);
            }
            console.log('File has been Deleted');
        });

    }, 30000);
        res.download(filePath);
    }
})

Ответ 8

Пакет json2csv был обновлен с момента написания ответа с наибольшим количеством голосов, более новая версия имеет немного другой синтаксис:

        var { Parser } = require('json2csv')

        const fields = [{
            label: 'header 1',
            value: 'field1_name'
        }, {
            label: 'header 2',
            value: 'field2_name'
        }]

        const json2csv = new Parser({ fields: fields })

        try {
            const csv = json2csv.parse(data)
            res.attachment('data.csv')
            res.status(200).send(csv)
        } catch (error) {
            console.log('error:', error.message)
            res.status(500).send(error.message)
        }

res.attachment является функцией, а не атрибутом. Нужно убрать знак равенства, чтобы это работало.