Node.js 和 mysql 回调:查询回调中的查询

Posted

技术标签:

【中文标题】Node.js 和 mysql 回调:查询回调中的查询【英文标题】:Node.js and mysql Callback : query in query callback 【发布时间】:2013-04-14 14:28:56 【问题描述】:

如果我的数据库没有数据,我想做的就是插入一些数据,所以我将插入 SQL 放入我的 Select SQL 的回调函数中,但出现如下错误:

[错误:调用退出后无法将查询排入队列。] 代码:'PROTOCOL_ENQUEUE_AFTER_QUIT',致命:false

我的代码 sn-p 在这里:

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

有人可以给我一些建议吗? 谢谢

----更新----

其实select SQL的回调函数并不是匿名函数,我的关于db.end()的代码sn-p是这样的:

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

【问题讨论】:

你是否在这段代码之后关闭了你的数据库连接? 是的,当我完成 db.query('select ...') 时,我调用了 db.end(); 这意味着当您的 INSERT 查询运行时,连接将被关闭。请将该代码添加到您的问题中,我会回答。 另外,你什么时候创建连接? 我的连接是在调用导出函数时创建的 【参考方案1】:

db.end() 调用将在 SELECT 完成后排队关闭连接,因此当您尝试执行内部 INSERT 查询时,数据库连接将已关闭,因此错误 PROTOCOL_ENQUEUE_AFTER_QUIT,因为您正在尝试在连接关闭后对新命令进行排队。

根据您创建连接的方式,您应该将db.end() 调用移到回调中,或者如果连接在程序启动时打开,则根本不调用db.end()

【讨论】:

完全不执行db.end() 会导致必须使用Ctrl-C 终止我的脚本(我在命令行上使用node 命令开始)。但这确实摆脱了PROTOCOL_ENQUEUE_AFTER_QUIT @Lori 正确,这就是为什么我用Depending on how you are creating the connection 开头。例如,如果您正在编写一个节点服务器,您只需打开一次连接,并且不期望服务器每次都会退出。如果您正在编写脚本,您可能希望在脚本中的所有操作完成后结束连接。

以上是关于Node.js 和 mysql 回调:查询回调中的查询的主要内容,如果未能解决你的问题,请参考以下文章

Async.js解决Node.js操作MySQL的回调大坑

Node.js 中的回调地狱

node.js + MySQL & JSON-result - 回调问题 & 对客户端无响应

告别回调地狱,在Node里优雅的访问MySQL

Node.js 异步编程与连接mysql数据库

使用 Node.js 从 AWS Lambda 函数连接到 MySql 数据库,没有连接回调