2013-01-15 16 views
18

dove chiudere la connessione mysql?Nodo Mysql Impossibile accodare una query dopo aver chiamato quit

Ho bisogno di eseguire query in sequenza. Sto scrivendo il codice che assomiglia a questo al momento:.

var sqlFindMobile = "select * from user_mobiles where mobile=?"; 
var sqlNewUser = "insert into users (password) values (?)"; 
//var sqlUserId = "select last_insert_id() as user_id"; 
var sqlNewMobile = "insert into user_mobiles (user_id, mobile) values (?,?)"; 
connection.connect(function(err){}); 
var query = connection.query(sqlFindMobile, [req.body.mobile], function(err, results) { 
    if(err) throw err; 
    console.log("mobile query"); 
    if(results.length==0) { 
     var query = connection.query(sqlNewUser, [req.body.password], function(err, results) { 
      if(err) throw err; 
      console.log("added user"); 
      var user_id = results.insertId; 
      var query = connection.query(sqlNewMobile, [user_id, req.body.mobile], function(err, results) { 
       if(err) throw err; 
       console.log("added mobile"); 
        //connection.end(); 
       }); 
     }); 
    } 
}); 
//connection.end(); 

(io sono un principiante con il nodo, NPM-express e NPM-mysql ho provato a cercare SO per "esprimere mysql non può accodare" per trovare le questioni relative e non li hanno trovati.)

risposta

10

Se si sta utilizzando il modulo nodo-mysql da felixge quindi è possibile chiamare connection.end() in qualsiasi momento dopo aver effettuato tutte le connection.query() chiama, poiché attenderà che tutte le query finiscano prima che termini la connessione.

Vedere example here per ulteriori informazioni.

Se si desidera eseguire molte query in serie, è necessario esaminare async module, è ottimo per gestire una serie di funzioni asincrone (ad esempio quelle che dispongono di una richiamata).

+0

Sto chiamando connection.end() quello che è commentato dopo il log "aggiunto mobile". il problema che sto rilevando è che se il flusso esce, cioè in uno qualsiasi dei punti di lancio (err), la connessione non verrà chiusa. Sono dolorosamente consapevole del fatto che le connessioni rimangono un errore da principiante e il suo effetto sulla scalabilità. Non voglio farlo a questo punto della mia vita. quindi se hai uno schema che potrebbe essere seguito per questo, sarebbe fantastico. async sembra essere una buona chiamata. Prenderò un giorno per controllarlo e rispondere ad esso. Grazie. –

+0

parlato a breve, async non funzionerebbe per me perché queste query sono nidificate, e non qualcosa che deve essere eseguito in serie. mantenere gli stati e controllare le precondizioni è troppo oneroso per questo. –

+0

È possibile utilizzare la funzione cascata per eseguire le query. Ho scritto la struttura di base qui: http://pastebin.com/RDaiqZsp – matthewtole

24

Ho risolto questo problema con questo metodo.

connection.end() nella funzione connection.query

Il codice fisso è here

+1

Poiché NodeJS asincronizza 'connection.end()' si attiva prima di eseguire la chiamata al database. – Eranda

4

Forse il problema è che la query MySQL viene eseguita dopo che la connessione è già chiuso, a causa della natura asincrona del nodo. Provare a utilizzare questo codice per chiamare connection.end() a destra prima il thread:

function exitHandler(options, err) { 
    connection.end(); 
    if (options.cleanup) 
     console.log('clean'); 
    if (err) 
     console.log(err.stack); 
    if (options.exit) 
     process.exit(); 
} 

//do something when app is closing 
process.on('exit', exitHandler.bind(null, {cleanup: true})); 

Codice adattato da @Emil Condrea, doing a cleanup action just before node.js exits

1

Nel mio caso connection.end era stato chiamato in un punto che è stato difficile da notare, quindi una chiamata errata a connection.end potrebbe essere il problema con questo errore

Problemi correlati