2013-01-15 30 views
18

Mysql bağlantısını nerede kapatırım?Düğüm Mysql Çıkışı çağırdıktan sonra sorguyu sorgulama

Sırayla sorguları çalıştırmam gerekiyor. .

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

(ben SO arama denedim düğüm, NPM-ekspres ve NPM-mysql ile bir acemi ilgili soruları bulmak için "enqueue olamaz mysql ifade": Ben şu anda şöyle bir kod yazıyorum ve onları bulamadım.)

cevap

10

Eğer connection.query tüm yaptıktan sonra o zaman herhangi bir noktada connection.end() çağırabilir felixge tarafından düğüm-mysql modülünü kullanıyorsanız(), tüm sorguların bağlantıyı sonlandırmadan önce bitmesi için bekleyeceği için çağrı yapar.

Daha fazla bilgi için example here'a bakın.

Seri olarak çok sayıda sorgu yürütmek istiyorsanız, async module'a bakmanız gerekir; bu, bir dizi eşzamansız işlevle (örn. Geri arama özelliği olan) ilgilenmek için harikadır.

+0

Ben connect.end() "eklenen mobil" günlüğüne sonra yorumlanır. Algıladığım problem, akıştan (yani) herhangi bir atım (err) noktasından çıkarsa, bağlantının kapatılmayacağıdır. Bağlantıları açık bir çaylak hatası ve ölçeklenebilirlik üzerindeki etkisi açık olarak biliyorum. Ben sadece bu noktada hayatımda yapmak istemiyorum. Yani bunun için takip edilebilecek bir modeliniz varsa, bu harika olurdu. async iyi bir çağrı gibi görünüyor. Kontrol etmek ve cevap vermek için bir gün süreceğim. Teşekkürler. –

+0

yakında konuşuluyor, async benim için işe yaramaz çünkü bu sorgular yuvalanmış ve seri olarak yürütülmesi gereken bir şey değil. durumları korumak ve önkoşulları kontrol etmek bunun için çok fazla masraflıdır. –

+0

Sorguları çalıştırmak için şelale işlevini kullanabilirsiniz. Burada temel yapıyı yazdım: http://pastebin.com/RDaiqZsp – matthewtole

24

Bu sorunu giderdim, bu yöntemi kullanın. senin connection.query fonksiyonunda

connection.end()

sabit kod Belki sorun bağlantısı zaten kapatıldıktan sonra mySQL sorgu dolayı, çalıştırılıyor olmasıdır here

+1

NodeJS eşzamansız olduğundan 'connection.end()', veritabanı çağrısını yürütmeden önce yanacaktır. – Eranda

4

olduğunu Düğümün asenkron doğası. Sağ diş çıkmadan önce) connection.end (çağırmak için bu kodu kullanmayı deneyin: @Emil Condrea uyarlanan

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

Kod benim durumda connection.end olarak doing a cleanup action just before node.js exits

1

bir noktada denilen ediliyordu fark etmek zor, bu yüzden bu hata ile ilgili bir sorun olabilir connection.end bu hata ile sorun olabilir

İlgili konular