2015-03-30 7 views
6

sto cercando seguente codice js nodo utilizzando mysql ma ottenere errore "Impossibile accodare query dopo aver invocato uscire.di query nidificate in js nodo utilizzando 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(); 

risposta

3

Rimuovere end function connessione

==>connection.end();

1

Il problema è connection.end() attivata prima la query non è ancora finito. Prova a mettere connection.end() alla fine del ciclo esterno.

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

Spero che ti sarà utile.

+0

le query sono asincrone quindi anche la connessione connection.end() dopo il ciclo for non risolve il problema – Edo

5

vedo due problemi nel codice:

  • si sta chiamando connection.end() modo sincrono, ma le vostre domande eseguito in un flusso asincrono. Devi chiamare connection.end() solo quando hai finito la seconda query.
  • Si sta utilizzando un normale ciclo for per eseguire chiamate asincrone (si outter loop).

Per realizzare ciò che si sta tentando di fare, è necessario considerare quegli scenari asincroni. Si potrebbe utilizzare promises o un modulo simile async, che fornisce un sacco di metodi per gestire i flussi assyncronous, come 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(); 
    } 
}); 

Ora sarà garantire che connection.end() sarà solo chiamato quando tutte le vostre domande hanno finito.