2015-03-30 13 views
6

Próbuję poniższy kod na js węzłów przy użyciu mysql ale coraz błąd „Nie można enqueue Query po wywołaniu zamknąć.zagnieżdżonych zapytań w js węzłów MySQL

var mysql = require('mysql'); 

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

connection.connect(); 

var queryString = 'SELECT * FROM tbl_product'; 

connection.query(queryString, function(err, rows, fields) { 
    if (err) throw err; 
    for (var i in rows) { 
     console.log('Product Name: ', rows[i].product_name); 
     var emp_query = 'SELECT * FROM tbl_employer'; 
     connection.query(queryString, function(emp_err, emp_rows, emp_fields) { 
      if (emp_err) throw emp_err; 
      for (var e in emp_rows) { 
       console.log('Employer Name: ', emp_rows[e].company_name); 
      } 
     }); 
    } 
}); 
connection.end(); 

Odpowiedz

3

Usuń funkcję kończenia połączenia

==>connection.end();

1

problem connection.end() wyzwalane przed zapytanie nie jest jeszcze zakończona. Staraj się umieścić connection.end() do końca pętli zewnętrznej.

connection.query(queryString, function(err, rows, fields) { 
    if (err) throw err; 
    for (var i in rows) { 
     console.log('Product Name: ', rows[i].product_name); 
     var emp_query = 'SELECT * FROM tbl_employer'; 
     connection.query(queryString, function(emp_err, emp_rows, emp_fields) { 
      if (emp_err) throw emp_err; 
      for (var e in emp_rows) { 
       console.log('Employer Name: ', emp_rows[e].company_name); 
      } 
     }); 
    } 
    connection.end(); 
}); 

nadzieję, że będzie użyteczny dla Ciebie.

+0

zapytania są asynchroniczne, więc nawet umieszczenie connection.end() po pętli for nie rozwiązuje problemu – Edo

5

Widzę dwa problemy w kodzie:

  • Dzwonisz connection.end() synchronicznie, ale Twoje zapytania uruchamiane w asynchronicznym przepływu. Musisz zadzwonić pod numer connection.end() dopiero po zakończeniu drugiego zapytania.
  • Używasz regularny for pętli uruchomić assynchronous połączenia (you outter pętla).

Aby osiągnąć to, co próbujesz zrobić, musisz wziąć pod uwagę te asynchroniczne scenariusze. Można użyć promises lub moduł jak async, który zapewnia wiele sposobów radzenia sobie z przepływów assyncronous, jak async.each():

connection.query(queryString, function(err, rows, fields) { 
    if (err) throw err; 

    async.each(rows, function (row, callback) { 
     console.log('Product Name: ', row.product_name); 
     var emp_query = 'SELECT * FROM tbl_employer'; 
     connection.query(queryString, function(emp_err, emp_rows, emp_fields) { 
      if (emp_err) callback(emp_err); 
      for (var e in emp_rows) { 
       console.log('Employer Name: ', emp_rows[e].company_name); 
      } 
      callback(); 
     }); 
    }); 
    }, function (err) { 
     connection.end(); 
    } 
}); 

Teraz będzie gwarantować, że connection.end() po prostu nazwać, kiedy wszystkie twoje pytania zostały zakończone.

Powiązane problemy