Estoy tratando de escribir una funcionalidad en la que estoy tratando de leer un archivo csv, y antes de eso estoy tratando de verificar que los encabezados de ese archivo csv particular se den correctamente o no. A continuación se muestra mi código
let validHeaders = false; fs.createReadStream(path) .pipe(csv.parse({headers : true , ignoreEmpty : true})) .on('headers',async function(headers){ validHeaders = await CustomValidation.isValidRowsExists(headers); console.log(validHeaders); // here i am getting true .on('data',async function(req,res,data){ console.log(validHeaders); //here i am getting false if(validHeaders){ //do somethingEsta es mi clase CustomValidation
class CustomValidation{ isValidRowsExists = async(csvRows) =>{ for(let i=0;i<csvRows.length;i++){ if(csvRows[0]==='Col1 && csvRows[1]==='Col2 ....){ return true; }else{ return false; } } } } module.exports = new CustomValidation;Cómo puedo usar el valor validHeaders
Probablemente necesites algo como esto:
const main = async () => { const csvStream = fs .createReadStream(path) .pipe(csv.parse({ headers: true, ignoreEmpty: true })); const validHeaders = await new Promise((resolve) => csvStream.on("headers", (headers) => resolve(CustomValidation.isValidRowsExists(headers)) ) ); csvStream.on("data", (data) => { if (validHeaders) { console.log(data); } }); }; main();Si CustomValidation.isValidRowsExists fuera asíncrono (pero vea a continuación):
La solución de moondef adjunta el .on("data") solo después de esperar el resultado de CustomValidation.isValidRowsExists . Pero para entonces, es posible que los eventos data ya hayan ocurrido.
Sugiero adjuntar los controladores de forma sincrónica y usar una promesa para registrar los datos de forma asincrónica, después de que se haya determinado la validez del encabezado.
var validHeaders; csvStream.on("headers", function(headers) { validHeaders = Promise.resolve(CustomValidation.isValidRowsExists(headers)); }) .on("data", function(data) { validHeaders.then(function(valid) { if (valid) console.log(data); }); }); Sin embargo , CustomValidation.isValidRowsExists como se muestra en realidad no es asíncrono, porque no contiene await y no devuelve una promesa.