2014-10-31 4 views
-3

мне нужно сделать SQL запрос к MySQL внутри другой функции, и я получаю результат запроса после моих главных функций возвращают значениесделать синхронный запрос к MySQL в node.js

connectionPool.getConnection(function (err, connection) { 
     connection.query("SELECT * FROM `sys_menu_top` WHERE `Type` = 'top' AND Active = 1 ORDER BY `Order`", function (err, rows, fields) { 
     if (rows) { 

      async.each(rows, function (row, callback) { 
      row.children = []; 
      connectionPool.getConnection(function (err, connection, sql) { 
       connection.query("SELECT * FROM `sys_menu_top` WHERE Parent = " + row.ID, function (err, children, fields) { 
//        console.log(children); 
       if (!err && children.length > 0) { 
        children.forEach(function (child) { 
        row.children.push(child); 
        }); 
        row.children.push(children); 
       } 
       else { 
        console.log(err); 
       } 
       }); 
      }); 
      callback(); 
      }, function (err) { 
      if (err) 
       console.error('error looping array\n\n'); 
      }); 
      process.nextTick(function() { 
      cb(null, rows); 
      });   
     } 

     }); 

    }); 

мой код возвращает строку без детей, но я может принимать детей в консоли после того, как функция возвращает результат первого запроса. Мне нужно поместить детей для каждой строки в эту строку, а затем вернуть результат.

+0

Почему вы не используете присоединиться к этому? –

+0

У меня нет индексов в этой таблице, и я не могу изменить структуру db. Поэтому, если у меня будет таблица 1Gb с линиями 8kk, это будет проблемой. И я буду расширять этот код с помощью if else, поэтому в некоторых случаях мне вообще не нужно делать второй запрос (ненужное соединение на таблице 1Gb без индексов - это не очень хорошая идея). Этот вопрос не о MYSQL, а о node.js –

+0

У вас есть индекс ... 'WHERE Parent =" + row.ID' –

ответ

0

Я знаю, что есть другой подход, но это может быть стоит попробовать, что следующим образом:

async.waterfall([ 
     function (callback) { 
     var q = "SELECT * FROM Rows"; 

     executeQuery(q, function(err, rows, fields) { 
      if (err) { callback(err); return; }; 
      if (rows) { 
       callback(null, rows); 
       return; 
      } 
     }); 
     }, 
     function (rows, callback) { 
     console.log(rows); 
     for (k in rows) { 
      if (rows[k].Parent != null) { 
       child = rows[k].id; 
       parent = rows[k].Parent; 

       for (j in rows) { 
        if (rows[j].id == parent) { 
         if (!rows[j].Children) rows[j].Children = []; 
         rows[j].Children.push(child); 
        } 
       } 
      } 
     } 
     callback(null, rows); 
     } 
    ], 
    function (err, rows) { 
      console.log(rows); 
}); 

Что я получаю с моей тестовой таблицы является:

[ { id: 1, Parent: null }, 
    { id: 2, Parent: 1 }, 
    { id: 3, Parent: 1 } ] 
[ { id: 1, Parent: null, Children: [ 2, 3 ] }, 
    { id: 2, Parent: 1 }, 
    { id: 3, Parent: 1 } ] 
Смежные вопросы