2013-08-19 17 views
13

Hej Próbuję wyeksportować csv z node.js (wyciągając dane z mongodb). Mam już dane ciągnięte i oddzielane przecinkami i wszystkim, ale teraz próbuję wymyślić jak faktycznie wysłać to ... Wstawiam ten kod do mojego pliku tras. Wszelkie porady dotyczące sposobu pobierania danych i przesyłania ich użytkownikowi bezpośrednio do pobrania na żądanie.Jak eksportować csv nodejs

oto kod: (I próba dolną część kodu druga funkcja)

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

Odpowiedz

19

Czy próbowałeś coś takiego z rodzaju zawartości jako "application/octet-stream"

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

lub po prostu

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

Express send() docs.

+0

Tak, to działa, ale jak ustawić typ zawartości poprawnie ... czy powinien pojawić się jako plik - w moim folderze pobierania? lub czy istnieje bardziej przyjazny sposób na wysłanie go? Działa to dobrze i otwiera się z każdą aplikacją, ale zastanawiał się tylko, czy istnieje lepszy sposób na ustawienie typu lub jak sprawić, by wyglądała ładniej, czy jest to sposób, w jaki ludzie to robią, jeśli próbujesz wysłać plik? – Lion789

+0

Co masz na myśli mówiąc "ładniej"? może "tekst/zwykły"? Czy możesz dać mi trochę więcej informacji o tym, co próbujesz zrobić. Twoje zdrowie. –

+0

Zasadniczo próbuję umożliwić użytkownikom pobranie ich listy kontaktów w trybie offline ... – Lion789

2

nie jestem całkowicie pewien, co masz pytanie, ale myślę, że to, co masz szukanie można rozwiązać, ustawiając nagłówek Content Disposition. Spójrz na tę odpowiedź na inne pytanie SO: https://stackoverflow.com/a/7288883/2320243.

+0

Próbuję wysłać listę znajomych użytkownika w trybie offline, pozwalając im pobrać tam listę znajomych jako csv, który jest tworzony z mongodb i wysłany bezpośrednio do użytkownika do pobrania bez pobierania go do naszego systemu ... to nie pomogło .. – Lion789

+1

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać odnośnik. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ review/low-quality-posts/17854998) –

1

Express-CSV jest wielki moduł do pisania zawartości CSV w celu przesyłania strumieniowego z serwera node.js, który zostanie wysłany jako odpowiedź do klienta (i pobrany jako plik). Bardzo łatwy w użyciu.

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

Docs: https://www.npmjs.com/package/express-csv

Kiedy przekazać obiekt, trzeba poprzedzić nagłówki jawnie (jeśli chcesz je). Oto mój mój przykład stosując 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); 
      }); 
    }); 
+0

Jak można przejść z powyższego kodu (dołączono obiekt csv do odpowiedzi), aby udostępnić go jako plik, który użytkownik może pobrać? – MayNotBe

+0

Widzę, że to wszystko, co jest wymagane do przedstawienia pobierania. Całkiem słodki. – MayNotBe

11

Oto co zrobiłem:

  1. Zastosowanie json2csv budować danych CSV z danymi 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. Wysyłaj dane csv do cli dowe

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

W jaki sposób konsumujesz to z przodu? – Ohjay44

+0

@ Ohjay44 Użyłem go na mojej stronie front end (FE) za pomocą frameworka express js. Jeśli podzielisz API i FE, uważam, że FE i API powinny komunikować się razem przez json. I wyeksportujesz te dane json do CSV na FE. Czy poprawnie rozumiem Twoje pytanie? –

+0

Okazuje się, że wszystko, co musiałem zrobić, to wyzwolić go, aby pobrać plik po otrzymaniu danych w JavaScript. Otrzymałem tylko plik w formacie raw, więc nie wiedziałem, jak rozpocząć pobieranie pliku CSV po zakończeniu wywołania. – Ohjay44

3

Hi guys podstawie @VierTD odpowiedzieć trzeba użyć json2csv budować danych CSV z danymi MongoDB

pakiet aktualizacji.json z dependecies

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

Tworzenie obiektu json2CSV, pamiętaj, to jest mapowanie dokument (tabela db), więc nazwy na „polach” musi pasować db tabeli fieldNames są do ciebie, ale są również ważne, ponieważ są to CSV nazwy kolumn plik

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

dane Wysłać CSV do klienta

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

This code pokazuje jak wyeksportować plik csv na podstawie Mongo dokumentu dB (dane tabela podstawowa)

Stworzyłem github repo naprawdę krótką próbkę pomysłu, utworzyłem również bazę danych z danymi fikcyjnymi pod Mongo Lab Website, więc ten kod będzie działać natychmiast w twoim komputerze. Oparty na @VietTD odpowiedź!

W przypadku zainteresowania na testowaniu tego kodu tylko pamiętać, aby zmienić następujące linie

Zmień db URL (User własną db to działa, ale to tylko dla celów pokazujących; D)

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

Zmień dokument docelowy (lub tabeli db)

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

kolumny Zmiana dokumentu (lub pól kolumn db stołu)

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

Wreszcie ustawić Ci nazwami tytuł kolumny CSV, jak również jak nazwa pliku CSV

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

Ostatni, ale nie najmniej

res.attachment('yourfilenamehere.csv'); 

Prosimy poprawić kod przykładowy będę docenić, że ! lub po prostu pobierz go i spójrz na kod, już posiada bazę danych, dzięki czemu będzie łatwy do zrozumienia i uruchomienia, w takim przypadku nie obchodzi cię cały kod, może zobaczysz coś interesującego:

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

Dzięki!

Powiązane problemy