2013-04-21 103 views
5

我想要做的就是插入一些數據,如果我的數據庫沒有,所以我把Insert SQL插入到我的Select SQL的回調函數中,但是出現錯誤像這樣:Node.js和mysql回調:在查詢回調中查詢

{ [Error: Cannot enqueue Query after invoking quit.] code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }

我的代碼片段是在這裏:

db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], function(error, result){ 
    if (result[0].Resultcount == 0){ 
     var query2 = db.query('INSERT INTO tablename SET ?', [post], function(err, result) { 
      if(err){ 
       console.log(err); 
      } 
      console.log(result); 
      }); 
    } 
    else{ 
     console.log('have data already'); 
    } 
}); 

可能有人給我一些建議嗎? 感謝

---- ----更新

實際上,選擇SQL的回調函數不是一個匿名函數,我對db.end()的代碼片段是這樣的:

var QueryResults = new queryResultFuntion(Back_results); 

    db.query('SELECT count(*) as Resultcount FROM tablename WHERE email = ? and password = ?', [post.email, post.password], QueryResults.queryResult); 


    db.end(); 
+0

你是否在這段代碼之後關閉了你的數據庫連接? – loganfsmyth 2013-04-21 17:59:32

+0

是的,當我完成db.query('select ...')時,我調用了db.end(); – Arvin 2013-04-21 18:02:46

+0

這意味着當您的INSERT查詢運行時,連接將被關閉。請將該代碼添加到您的問題中,我會回答。 – loganfsmyth 2013-04-21 18:04:21

回答

14

db.end()呼叫排隊關閉一旦SELECT的連接已經完成,所以當你試圖做內INSERT查詢,數據庫連接將被關閉,因此錯誤PROTOCOL_ENQUEUE_AFTER_QUIT,因爲你正試圖排隊一個新的連接關閉後的命令。

根據您創建連接的方式,您應該在回調中移動db.end()調用,或者在程序啓動時打開連接時根本沒有db.end()調用。

+0

不用'db.end()'導致必須用Ctrl-C終止我的腳本(我在命令行上用'node'命令啓動)。但是,這確實擺脫了'PROTOCOL_ENQUEUE_AFTER_QUIT' – Lori 2015-10-26 16:22:03

+2

@Lori正確,這就是爲什麼我用'取決於你如何創建連接'的前序。如果你正在編寫一個節點服務器,你只需要打開一次連接,並且不希望服務器每次都退出。如果您正在編寫腳本,則腳本中的所有操作都已完成後,您會希望結束連接。 – loganfsmyth 2015-10-26 16:24:55