节点模块中的返回变量回拨

时间:2017-04-28 04:03:09

标签: javascript node.js node-modules

我使用this NPM package从访问数据库中获取表的CSV输出。

我的功能结构如下:



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
}




我确定这是一些范围问题,但我是节点的新手,并且不知道如何正确搜索。从我可以看出,模块是同步的,但范围不起作用。

任何帮助将不胜感激!不幸的是,我必须使用访问DB文件的客户端,我只是想让它工作。

1 个答案:

答案 0 :(得分:1)

范围看起来很好,但toCsv函数看起来不同步。您可以仔细检查源代码:https://github.com/maxogden/node-mdb/blob/master/index.js。因此,在调用toCsv回调之前,您会尝试打印rawTable

我还会在两个回调中添加正确的错误处理,以查看是否收到任何错误。

编辑:

由于您的createDB函数进行异步调用,因此应该进行回调。下面的代码是一个可能适用于您的案例的例子。

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

当你调用createDB时,你必须提供一个回调:

createDB( mdbFile , ( err, db )=>{
    if( err ) return err;
    // use db e.g. res.send( db )
}

或者您可以通过承诺来研究如何实现这一目标。