2014-10-03 19 views
9

Sto cercando di implementare un modulo in nodejs (appena iniziato a lavorare in nodejs) che ha seguito come requisitocontenuti di lettura di file CSV in node.js

  1. Carica file .csv.
  2. Leggi il contenuto del file csv.

I quadri attualmente in uso per api restful sono "express": "~ 4.2.0" e multer per il caricamento di file.

Ora ho configurato Multer come qui di seguito nella mia app.js

app.use(multer({ 
    onFileUploadData : function(file, data){ 
    console.log('onFileUploadData Called with data - '+ data); 
    } 
})); 

Nel mio file percorso, ho un endpoint post come di seguito

app.post('/sample.csv',lead.processCSV); 

Questo percorso è stato chiamato dal una chiamata ajax sotto come

$.ajax({ 
      xhrFields: {withCredentials: true}, 
      url: '/sample.csv', 
      type: 'POST', 
      success: function (data) { 
       $scope.handleResponse(data); 
      }, 
      error: function (error, xhr) { 
       angular.element('#csvUploadBusyIcon').hide(); 
       alert('Oops! Upload failed'); 
      }, 
      data: formData, 
      cache: false, 
      contentType: false, 
      processData: false 
     }); 

Ora voglio ottenere Il contenuto del file CSV, cioè quando tutto il contenuto è stato caricato, dovrei gestire il mio metodo lead.processCSV.

Inoltre ho bisogno di altri moduli per i file CSV, o Multer è sufficiente nel mio caso?

Qualsiasi suggerimento/guida nella giusta direzione sarà utile. Grazie in anticipo.

risposta

18

C'è un progetto di nodo fantastico che mi ha aiutato molto. Si dovrebbe check it out Quello che useremo è il loro modulo csv-parse. È in grado di ottenere uno stream come input e leggerlo riga per riga senza bloccare il ciclo degli eventi, quindi in pratica mentre si elabora un file il server non sarà bloccato e altre richieste possono ancora essere elaborate normalmente.

Dato che hai appena detto che stai iniziando con nodejs, dovresti fare una rapida ricerca e capire come midlewares lavorano nel processo di gestione delle richieste. Come semplificazione per la gestione delle richieste, un middleware è una funzione (req, res, next). Con req ottieni dati di richiesta. Con res è possibile inviare la risposta e successivamente si inviano gli oggetti req e res al middleware successivo. In questo modo è possibile elaborare una richiesta in parti e l'ultimo middleware del flusso invierà risposta al client (res.send (200) per esempio)

la chiamata Multer ({...}) restituisce una funzione middleware . Quando una richiesta arriva a questo middleware, multer proverà a scaricare tutti i file che l'utente invia nella richiesta di posta. Quando dici app.use (Multer ({...})), stai chiedendo a multer di provare a scaricare i file da QUALSIASI richiesta post che contiene file. Questo è un rischio per la sicurezza se non tutti i tuoi percorsi prevedono file da caricare.

Ok, detto questo, ecco un esempio di codice che ho scritto per gestire il vostro caso d'uso:

//Important Security advice: 
//don't add multer as a middleware to all requests. 
//If you do this, people will be able to upload files 
//in ALL YOUR 'post' handlers!!! 

var Multer = require('multer'); 
var Parse = require('csv-parse'); 
var fs = require('fs') 

function parseCSVFile(sourceFilePath, columns, onNewRecord, handleError, done){ 
    var source = fs.createReadStream(sourceFilePath); 

    var linesRead = 0; 

    var parser = Parse({ 
     delimiter: ',', 
     columns:columns 
    }); 

    parser.on("readable", function(){ 
     var record; 
     while (record = parser.read()) { 
      linesRead++; 
      onNewRecord(record); 
     } 
    }); 

    parser.on("error", function(error){ 
     handleError(error) 
    }); 

    parser.on("end", function(){ 
     done(linesRead); 
    }); 

    source.pipe(parser); 
} 

//We will call this once Multer's middleware processed the request 
//and stored file in req.files.fileFormFieldName 

function parseFile(req, res, next){ 
    var filePath = req.files.file.path; 
    console.log(filePath); 
    function onNewRecord(record){ 
     console.log(record) 
    } 

    function onError(error){ 
     console.log(error) 
    } 

    function done(linesRead){ 
     res.send(200, linesRead) 
    } 

    var columns = true; 
    parseCSVFile(filePath, columns, onNewRecord, onError, done); 

} 

//this is the route handler with two middlewares. 
//First: Multer middleware to download file. At some point, 
//this middleware calls next() so process continues on to next middleware 
//Second: use the file as you need 

app.post('/upload', [Multer({dest:'./uploads'}), parseFile]); 

Spero che questo ha aiutato. Assicurati di capire come funzionano i nodi middleware nel nodo: sono la chiave per un codice di buona qualità.

Marcel

+0

molte grazie per questa risposta - ha funzionato perfettamente – iancrowther