2013-01-15 18 views
18

पर कॉल करने के बाद एक क्वेरी को एनक्यू नहीं कर सकता है, जहां मैं mysql कनेक्शन बंद कर सकता हूं?नोड माईस्क्ल

मुझे अनुक्रम में क्वेरी चलाने की आवश्यकता है। मैं कोड है जो वर्तमान में इस तरह दिखता है लिख रहा हूँ:।

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

(मैं नोड, NPM-एक्सप्रेस और NPM-mysql के साथ एक शुरुआत के लिए एसओ खोज रहा कोशिश की है हूँ "mysql व्यक्त enqueue नहीं कर सकते" से संबंधित प्रश्नों को खोजने के लिए और उन्हें नहीं मिली है।)

उत्तर

10

आप द्वारा felixgeनोड mysql मॉड्यूल का उपयोग कर रहे हैं तो आप किसी भी बिंदु पर connection.end() के बाद आप connection.query के सभी कर दिया है कॉल कर सकते हैं() कॉल, क्योंकि यह कनेक्शन समाप्त होने से पहले सभी प्रश्नों को समाप्त करने की प्रतीक्षा करेगा।

अधिक जानकारी के लिए example here देखें।

यदि आप श्रृंखला में बहुत से प्रश्नों को चलाने के इच्छुक हैं, तो आपको async module में देखना चाहिए, यह अतुल्यकालिक कार्यों (यानी जिनके पास कॉलबैक है) की श्रृंखला से निपटने के लिए यह बहुत अच्छा है।

+0

मैं कनेक्शन जोड़ा गया हूं() जिसे "जोड़ा गया मोबाइल" लॉग के बाद टिप्पणी की गई है। जिस समस्या को मैं समझ रहा हूं वह यह है कि यदि प्रवाह किसी भी फेंक (गलती) बिंदुओं में से बाहर निकलता है, तो कनेक्शन बंद नहीं होगा। मैं दर्दनाक रूप से जागरूक हूं कि कनेक्शन को एक गड़बड़ गलती और स्केलेबिलिटी पर इसका असर खुलता है। मैं बस अपने जीवन में इस बिंदु पर ऐसा नहीं करना चाहता हूं। इसलिए यदि आपके पास ऐसा पैटर्न है जिसका पालन किया जा सकता है, तो यह बहुत अच्छा होगा। Async एक अच्छी कॉल प्रतीत होता है। मैं इसे देखने के लिए एक दिन लेगा और इसका जवाब दूंगा। धन्यवाद। –

+0

जल्द ही बोली जाती है, async मेरे लिए काम नहीं करेगा क्योंकि ये प्रश्न घोंसले हैं, और ऐसा कुछ नहीं है जिसे श्रृंखला में निष्पादित किया जाना है। राज्यों को बनाए रखना और पूर्व शर्त की जांच करना इसके लिए बहुत अधिक है। –

+0

आप क्वेरी चलाने के लिए झरना समारोह का उपयोग कर सकते हैं। मैंने यहां मूल संरचना लिखी है: http://pastebin.com/RDaiqZsp – matthewtole

24

मैंने इस समस्या का समाधान इस विधि का उपयोग किया है।

connection.end() अपने connection.query समारोह में

तय कोड here

+1

चूंकि नोडजेएस एसिंक्रनाइज़ 'कनेक्शन.एंड() 'डेटाबेस कॉल निष्पादित करने से पहले आग लग जाएगा। – Eranda

4

है हो सकता है कि समस्या यह है कि MySQL क्वेरी के कारण बाद कनेक्शन पहले से ही बंद कर दिया है निष्पादित किया जाता है, है नोड की असीमित प्रकृति। सही धागा बाहर निकलता से पहले) connection.end (कॉल करने के लिए इस कोड का उपयोग का प्रयास करें:

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

कोड @Emil Condrea से अनुकूलित, doing a cleanup action just before node.js exits

1

मेरे मामले connection.end में एक जगह है कि था में बुलाया जा रहा था नोटिस करना मुश्किल है, इसलिए कनेक्शन.एंड के लिए एक गलती कॉल इस त्रुटि के साथ समस्या हो सकती है