Javascript作用域。如何从回调函数中检索信息?节点mysql

Javascript作用域。如何从回调函数中检索信息?节点mysql,javascript,node.js,node-mysql,Javascript,Node.js,Node Mysql,我是Javascript的新手,我试图创建一个函数来返回我从数据库中获得的ITEN数组。首先,我尝试了这个: function getItens(userId){ var arr = new Array; var result; var connection = mysql.createConnection({ host : 'localhost', user : 'XXXXXX', password : 'XXXXX

我是Javascript的新手,我试图创建一个函数来返回我从数据库中获得的ITEN数组。首先,我尝试了这个:

function getItens(userId){

    var arr = new Array;
    var result;
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'XXXXXX',
      password : 'XXXXXX',
      database : 'XXXXXX',
    });

    connection.connect();
    connection.query('SELECT * from itens where userId = '+ userId function(err, rows, fields){
         if (err) throw err;
         arr = rows.slice()
    });

    return arr;
    connection.end();
}
然后我意识到存在范围问题,经过一些研究,我尝试模拟一个静态变量,如下所示:

function getItens(userId){

  (function (){
      var resultado;
      Result = function(valor) { resultado = valor; }; 
      Result.prototype.getResultado = function (){return resultado};
      Result.prototype.setResultado = function (valor){ resultado = valor; };
  })();

  var ar = new Result([]);


  var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'XXXXXX',
      password : 'XXXXXX',
      database : 'XXXXXX',
    });

  connection.connect();
  connection.query('SELECT * from itens where userId = '+ userId , function(err, rows, fields){
        if (err) throw err;
        ar.setResultado(rows.slice());

  });

  return ar.getResultado();
  connection.end();
}

但它不起作用,我做错了什么

您会回调
查询
函数,因为它不会立即执行

在调用
connection.query
之后的行中,回调尚未运行

您必须使用您提供的回调中的数据。请注意,常见的模式是向查询函数提供回调:

function fetchItens(userId, callback){

    var arr = new Array;
    var result;
    var connection = mysql.createConnection({
      host     : 'localhost',
      user     : 'XXXXXX',
      password : 'XXXXXX',
      database : 'XXXXXX',
    });

    connection.connect();
    connection.query('SELECT * from itens where userId = '+ userId function(err, rows, fields){
         if (err) throw err;
         arr = rows.slice()
         callback(arr);
    });
    connection.end();
}

fetchItens(someId, function(arr){
   // use arr
});

由于NodeJS中的大多数I/O是异步的,因此需要通过调用函数来更改函数和使用的代码。您应该在“回调”中思考,并理解在这种情况下不能使用return。查询时,不会立即执行。它只是注册一个回调,当MySQL服务器响应您的应用程序时,才调用该回调。例如:

function getItems(userid, callback){
   connection.connect();
   connection.query("SELECET .....", function(err,rows,fields){
       callback(rows.slice());
   }
}

var userid = 5;
getItems(userid, function(items){
    for(var i in items){ 
    .....
    }
});
可能重复的