2013-04-21 104 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