Estoy usando este paquete NPM para obtener la salida CSV de la tabla desde una base de datos de acceso.
Tengo mi función estructurada de la siguiente manera:
function createDB(mdbfile){ var rawDB = mdb(mdbfile); var db = {} rawDB.tables(function(err, table){ table.forEach(function(item){ var rawTable = null; rawDB.toCSV(item, function(err, csv){ rawTable = csv; //Doesn't work }); console.log(rawTable); //Always null :( var newTable = Do stuff with CSV; db.item = newTable; }); }); return db }Estoy seguro de que se trata de un problema de alcance, pero soy nuevo en el nodo y no sé cómo buscarlo correctamente. Por lo que puedo decir, el módulo es síncrono pero el alcance no funciona.
¡Cualquier ayuda sería apreciada! Desafortunadamente, un cliente que tengo DEBE usar el archivo DB de acceso y solo estoy tratando de hacer que esto funcione.
El alcance se ve bien, pero la función toCsv no parece sincrónica. Puede verificar dos veces el código fuente: https://github.com/maxogden/node-mdb/blob/master/index.js . Por lo tanto, intentaría imprimir rawTable antes de llamar a la devolución de llamada toCsv.
También agregaría el manejo adecuado de errores dentro de ambas devoluciones de llamada para ver si está recibiendo algún error.
EDITAR:
Dado que su función createDB realiza llamadas asincrónicas, debería recibir una devolución de llamada. El siguiente código es un ejemplo que posiblemente podría funcionar para su caso.
// look into the async module, specifically forEach const asyncForEach = require('async/forEach'); function createDB(mdbfile, next ){ var rawDB = mdb(mdbfile); var db = {} rawDB.tables(function(err, table){ if( err ) return next(err); asyncForEach( table, function(item, cb){ rawDB.toCSV(item, ( err, csv )=>{ if( err ) return cb( err ); // this processing can be done here or in the callback to asynForEach var newTable = Do stuff with CSV; db.item = newTable; cb(null, csv); }; }, function(err, csvs){ // csvs can be processed and added to db here as well if ( err ) return next( err ); return next( null, db ); } ); } ); }Entonces tendría que proporcionar una devolución de llamada a createDB cuando lo llame:
createDB( mdbFile , ( err, db )=>{ if( err ) return err; // use db eg res.send( db ) }O podría investigar cómo lograr esto con promesas.