2016-11-19 3 views
1

Im пытается создать приложение, которое требует, чтобы я делал несколько запросов для каждого вида/контроллера.Несколько зависимых запросов SQL в Node.js

Я пытаюсь сделать асинхронно, используя вложенную структуру, но результат sql не отображается во внутреннем закрытии.

Это функция Im, используя для этого:

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

Im новый узел и не уверен, как его применить в этом случае – yevg

+0

http://caolan.github.io/async/ очень важно понять 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