web-dev-qa-db-fra.com

Comment exporter des noeuds csv

Hé j'essaye d'exporter un csv de node.js (en tirant les données de mongodb). J'ai déjà les données extraites et séparées par des virgules et tout, mais maintenant j'essaie de comprendre comment les envoyer réellement ... Je colle ce code dans mon fichier de routes. Tout conseil sur la façon de prendre le tableau de données et de l'envoyer à un utilisateur directement pour le télécharger sur demande.

voici le code: (j'ai essayé la partie inférieure du code la deuxième fonction)

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'));
        });
    });     
};
18
Lion789

Avez-vous essayé quelque chose comme ceci avec un type de contenu comme "application/octet-stream"

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

ou simplement

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

Docs express send ().

22
Jonathan P. Diaz

Voici ce que j'ai fait:

  1. Utilisez json2csv pour construire des données csv à partir de données 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. Envoyer des données CSV au client

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

Salut les gars basés sur @VierTD, vous devez utiliser json2csv pour construire des données csv à partir de données mongodb

Mettre à jour Package.json avec des dépendances

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

Créez l'objet json2CSV, rappelez-vous qu'il s'agit de mapper votre document (table db), de sorte que les noms sur les "champs" doivent correspondre à la table db.

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 });

Envoyer des données CSV au client

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

Ce code montre comment exporter un fichier csv basé sur un document mongo db (table de base de données)

J'ai créé un rapport github très bref pour échantillonner l'idée, ainsi qu'une base de données avec des données factices sur Site Web Mongo Lab afin que ce code s'exécute immédiatement sur votre ordinateur.

Si vous souhaitez tester ce code, n'oubliez pas de modifier les lignes suivantes.

Changer l'adresse de la base de données (utilisez votre propre base de données, cela fonctionne, mais uniquement à des fins d'affichage; D)

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

Changer le document cible (ou la table db)

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

Modifier les colonnes du document (ou les champs de colonne de la table db)

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

Enfin, définissez vos noms de colonne de titre CSV ainsi que votre nom de fichier CSV

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

Enfin et surtout

res.attachment('yourfilenamehere.csv');

N'hésitez pas à améliorer l'exemple de code, je l'apprécierai! ou tout simplement le télécharger et jeter un coup d'oeil au code, il est déjà livré avec la base de données, il sera donc facile à comprendre et à utiliser. Dans un tel cas, vous n'avez pas d'importance

//
// 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';

Merci!

3
d1jhoni1b

Je ne suis pas tout à fait certain de la nature de votre question, mais je pense que ce que vous recherchez peut être résolu en définissant l'en-tête Content Disposition. Regardez cette réponse sur une autre question SO: https://stackoverflow.com/a/7288883/2320243 .

2
ncthom91

Express-csv est un excellent module pour écrire le contenu csv en flux depuis un serveur node.js, qui sera envoyé en réponse au client (et téléchargé en tant que fichier). Très facile à utiliser.

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

Les documents: https://www.npmjs.com/package/express-csv

Lorsque vous passez un objet, vous devez ajouter les en-têtes de manière explicite (si vous le souhaitez). Voici mon exemple avec 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);
            });
    });
1
Federico

À l'aide de la bibliothèque json2csv, vous pouvez exporter le format csv à partir de données 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);
    }
})
0
chyangba

J'ai trouvé une solution à ceci http://nikgrozev.com/2017/05/10/mongo-query-to-CSV-download-expressjs/

Mot-clé 

diffuser la sortie à la réponse HTTP

0
ChuongTran