Lectura de contenidos del archivo csv en node.js

Estoy intentando implementar un módulo en nodejs ( recién comencé a trabajar en nodejs ) que tiene el siguiente requisito como

  1. Sube el archivo .csv.
  2. Leer el contenido del archivo csv.

Los marcos que se utilizan actualmente para una api de descanso son “express“: “~ 4.2.0” y multer para la carga de archivos.

Ahora he configurado multer como abajo en mi app.js

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

En mi archivo de ruta, tengo un punto final de publicación como el siguiente

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

Esta ruta se llama desde una llamada ajax a continuación como

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

Ahora quiero obtener el contenido del archivo csv, es decir, cuando todo el contenido se ha cargado, debo manejar mi método lead.processCSV .

¿También necesito algún otro módulo para archivos csv, o multer es suficiente en mi caso?

Cualquier sugerencia / orientación en la dirección correcta será útil. Gracias por adelantado.

Hay un proyecto de nodo impresionante que me ayudó mucho. Deberías verlo. Lo que vamos a usar es su módulo csv-parse. Puede obtener un flujo como entrada y leerlo línea por línea sin bloquear el bucle de eventos, por lo que, básicamente, mientras procesa un archivo, su servidor no se atascará y otras solicitudes pueden procesarse normalmente.

Dado que acaba de comenzar con nodejs, debe realizar una búsqueda rápida y comprender cómo funcionan los dispositivos intermedios en el proceso de gestión de solicitudes. Como una simplificación para el manejo de solicitudes, un middleware es una función (req, res, next). Con req obtienes datos de solicitud. Con res puede enviar la respuesta, y luego enviar sus objetos de solicitud y resolución al siguiente middleware. De esta forma puede procesar una solicitud en partes y el último middleware del flujo enviará una respuesta al cliente (res.send (200) por ejemplo)

la llamada Multer ({…}) devuelve una función de middleware. Cuando una solicitud llega a este Middleware, Multer intentará descargar cualquier archivo que el usuario envíe en la solicitud posterior. Cuando dices app.use (Multer ({…})), le estás pidiendo a Multer que intente descargar archivos de CUALQUIER solicitud de publicación que contenga archivos. Esto es un riesgo de seguridad si no todas sus rutas esperan que se carguen archivos.

Ok, dicho esto, aquí hay un código de muestra que escribí para manejar su caso de 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]); 

Espero que esto haya ayudado. Asegúrese de comprender cómo funcionan las rutas de middlewares en el nodo: son una clave para el código de buena calidad.

Marcel