使用mysql和node.js更新foreach外部的变量值

使用mysql和node.js更新foreach外部的变量值,mysql,node.js,asynchronous,Mysql,Node.js,Asynchronous,我在理解node.js中的异步回调时遇到问题 这是我的代码: //userRole is a session value //capabilities is an array of strings var check = 0; capabilities.forEach((index)=> { connection.query("SELECT * FROM doc_users_role WHERE name = ? AND " + index + "= 1 ",[userR

我在理解node.js中的异步回调时遇到问题

这是我的代码:

//userRole is a session value

//capabilities is an array of strings

var check = 0;

capabilities.forEach((index)=> {

connection.query("SELECT * FROM doc_users_role WHERE name = ?

AND " + index     + "= 1 ",[userRole], function(err, rows){

if(rows.length == 1){

check++;}

});
})
console.log(check) //returns always 0;

如何以异步方式解决此问题?我需要更新回调中的变量检查连接。查询foreach中的变量检查…谢谢

这可以通过使用异步模块实现,如下所示。由于nodejs的非阻塞特性,除非另有说明,否则它将继续执行而不等待循环完成。这就是回调的用武之地。forEachSeries循环的每个迭代都将执行,然后执行回调以告知循环已准备好进行下一次迭代。这样,每次迭代都会依次完成。控制台日志随后被放置在最后一个块中,这是forEachSeries完成时将执行的代码段,因此确保显示变量的正确值。我希望这能回答你的问题

        async.forEachSeries(capabilities, function (index, forEachCallback){ 

            connection.query("SELECT * FROM doc_users_role WHERE name = ?

            AND " + index     + "= 1 ",[userRole], function(err, rows){

                if(rows.length == 1){
                    check++;
                    forEachCallback();
                }
                else{
                    forEachCallback();
                }

            });

        }, function(err) {
            if ( err ){
                // catch error and do something
                return;
            }
            console.log( check );
        }); 

看起来您正在异步执行此操作。作为最后一个参数传递的函数是回调函数。这太棒了。现在我有最后一个问题。capabilities是一种类角色的方法,当我到达某些特定的路由时,我会调用它。事实上,我需要将整个capabilities方法返回为true,这样当我对路由节点发出get请求时,首先检查roles.capabilities是否为true,如果为true,它会发送一些响应。。。你能帮帮我吗?当var检查等于capabilities时,我无法返回整个函数true。length。。。非常感谢,如果我正确理解了您的问题,那么您应该更换console.log检查;使用if语句检查check是否等于roles.capabilites.length,如果是,则将roles.capabilites设置为true,就像roles.capabilites=true一样,希望这有助于解决您的问题,如果我上面的答案解决了您最初的问题,请将其标记为正确,谢谢