Javascript 在node.js中正确使用此内部回调函数

Javascript 在node.js中正确使用此内部回调函数,javascript,node.js,callback,Javascript,Node.js,Callback,运行“构造函数”脚本时,访问此类中的变量时出错。有什么想法吗 /** * Info */ exports.sqlWhiteList = function(){ var sqlImport = require('../DBConnectors/MYSQLConn.js'); var sql = new sqlImport.sqlConn(); //fill up static variables this.tables = {}; this.attr

运行“构造函数”脚本时,访问此类中的变量时出错。有什么想法吗

/**
 * Info
 */
exports.sqlWhiteList = function(){

    var sqlImport = require('../DBConnectors/MYSQLConn.js');
    var sql = new sqlImport.sqlConn();

    //fill up static variables
    this.tables = {};
    this.attributes = {};

    //populate the table names
    sql.performQuery(('xxxxxx xxxxx = \'BASE TABLE\' ' +
        'AND TABLE_SCHEMA=\'' + sql.credentials.database + '\''),function(rows){

        for (var index in rows){
            this.tables[rows[index]['TABLE_NAME']] = true; // this fails
        }
    });
};

Error=“TypeError:无法读取未定义”的属性“tables”

您只需将
存储在外部函数中,以便回调可以获得正确的值:

var moduleObj = this;

// ...

//populate the table names
sql.performQuery(('xxxxxx xxxxx = \'BASE TABLE\' ' +
    'AND TABLE_SCHEMA=\'' + sql.credentials.database + '\''),function(rows){

    for (var index in rows){
        moduleObj.tables[rows[index]['TABLE_NAME']] = true; // this fails
    }
});

另外,我强烈建议不要对…使用
。。。在
循环中,对查询返回的行进行迭代。我不熟悉API,但我愿意打赌它是一个真正的JavaScript数组。您应该使用带有索引变量的普通
for
循环,或者使用
.forEach()
调用。正在为…使用
。。。在
中,数组是一种不好的做法,原因有几个,尤其是在某些情况下,它会导致V8(可能还有其他运行时)放弃对函数代码进行认真优化的尝试。其中一种情况是在数组上使用它。

这是创建一个索引来查找DB表名。它表示“Type Error:无法读取属性”的“未定义表”,在一个旁注中,您应该真正考虑节点的<代码> NoSQL语言>代码>数据库,例如。使一切变得更好。同意,但我们现在必须支持SQL DB,所以我正在尝试创建模块来连接任何类型的DBI。我没有否决,但我怀疑任何人都想知道您提到的错误实际上是什么样子。作为旁注,请阅读此文以正确理解“这”是怎么回事在js中工作:仍然收到错误:“TypeError:无法读取未定义的属性‘tables’”类似乎未定义??您在“sqlWhiteList”函数中添加了
var
声明,对吗?哦,等一下;“module”可能不是最好的变量名:)但是我不认为这会导致那个特殊的问题。那么它应该在导出行之前?@WilliamFalcon不,它应该在函数内部。错误发生在SQL回调中,对吗?这没有多大意义,因为如果“sqlWhiteList”中的
this
未定义的
,那么对
this
属性的赋值也会失败。@WilliamFalcon问题的关键是,当SQL函数执行回调时,
的值不会与该回调之外的值相同;它将是SQL API决定的任何内容。通过在“sqlWhiteList”函数中的另一个变量中保存
,您可以使该回调访问您需要它访问的对象。