1

私は Javascript の初心者で、DB から取得した itens の配列を返す関数を作成しようとしていました。最初にこれを試しました:

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

しかし、うまくいきませんでした。何が間違っていますか?

4

2 に答える 2

2

query関数はすぐには実行されないため、関数にコールバックを渡します。

への呼び出しの直後の行では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
});
于 2013-02-10T16:17:10.537 に答える
0

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){ 
    .....
    }
});
于 2013-02-10T16:18:55.063 に答える