gpt4 book ai didi

javascript - Node 模块回调中的返回变量

转载 作者:行者123 更新时间:2023-12-03 04:26:46 26 4
gpt4 key购买 nike

我正在使用this NPM package从 Access 数据库获取表的 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
}

我确信这是一些范围问题,但我是 Node 新手,不知道如何正确搜索它。据我所知,该模块是同步的,但范围不起作用。

如有任何帮助,我们将不胜感激!不幸的是,我的客户必须使用访问数据库文件,而我只是想让这项工作正常进行。

最佳答案

范围界定看起来不错,但 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 )
}

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

关于javascript - Node 模块回调中的返回变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43671769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com