2016-11-19 10 views
1

私はビュー/コントローラごとに複数のクエリを作成する必要があるアプリケーションを作成しようとしています。Node.jsの複数の従属SQLクエリ

入れ子構造を使用して非同期的に処理しようとしていますが、sql結果が内部クロージャで定義されていません。

これは、これを行うために使用してイム機能です:

var conn = db.config(mysql); 

function run_queries(conn,callback) { 

    conn.query(sql1, var1, function(err, res1) { 

     if(err){ callback(err); return; } 

     console.log(res1);  // RETURNS SUCCESSFULLY! 

     conn.query(sql2, var2, function(err, res2) { 

      if(err){ callback(err); return; } 

      console.log(res2); // UNDEFINED :(

      callback(null, res2); 

     }); 

    }); 

} 

run_queries(conn,function(err, result){ 

    console.log(result);  // UNDEFINED :(

}); 

私は私のSQLをチェックして、それがエラーなしです。 sq1をsq2と交換すると、外側のクロージャはsq2の正しいクエリを返します。

内部クロージャはクエリを返すだけではありません。

+0

を使用してコードの

例は、なぜ非同期モジュールを使用していませんでしたか? –

+0

ノードに新規で、この場合に適用する方法がわからない – yevg

+0

http://caolan.github.io/async/非同期を理解することは非常に重要です。私はasync.parallelを使用して、あなたのために例を挙げます。 –

答えて

2

非同期呼び出しでは、Asyncは非常に便利です。非同期モジュールを使用してコードを適切に保守することができます。 async.parallel

var conn = db.config(mysql); 
var async = require('async'); 

function run_queries(conn, cb) { 


    async.parallel({ 

     res1: function (cb) { 

     conn.query(sql1, var1, function (err, res1) { 
      if (err) { cb(err) } 
      else { cb(null, res1) } 
     }) 
     }, 
     res2: function (cb) { 

     conn.query(sql2, var2, function (err, res2) { 
      if (err) { cb(err) } 
      else { cb(null, res2) } 
     }) 
     } 
    }, 
    function (err, result) { 
     if (err) { cb(err) } 
     else { cb(null, result) } 
    }) 

} 

run_queries(conn, function (err, result) { 
    console.log(result);  // UNDEFINED :(
    // GET OBJECT OF res1 AND res2 
}); 
+0

これはうまく機能していて、構造ははるかに単純で、任意の数のクエリに対して関数を作成できます。ありがとうございました!! – yevg