开发者社区 问答 正文

MySQL NodeJS错误:使用事务调用退出后无法排队查询

我一直在为NodeJS和Restify实现MySQL,并且在查询方面一切都工作得很好。但是,当我想使用通过事务更新数据的功能时,出现以下错误:错误:调用退出后无法使查询入队。

这是跟踪:

(node:10877) UnhandledPromiseRejectionWarning: Error: Cannot enqueue Query after invoking quit. at Protocol._validateEnqueue (/home/node_modules/mysql/lib/protocol/Protocol.js:215:16) at Protocol._enqueue (/home/node_modules/mysql/lib/protocol/Protocol.js:138:13) at Connection.query (/home/node_modules/mysql/lib/Connection.js:201:25) at Connection.beginTransaction (/home/node_modules/mysql/lib/Connection.js:154:15) at Promise (/home/app/mysql/repository/ClientDao.ts:56:23) at new Promise ( ) at ClientDao.updateIps (/home/app/mysql/repository/ClientDao.ts:55:16) at /home/app/routes/ips/put.ts:22:31 at Generator.next ( ) at fulfilled (/home/app/routes/ips/put.ts:5:58) 这是代码:

this.conn.connect(); return new Promise ((resolve, reject) => { this.conn.beginTransaction( (err) => { if(err) { reject(err); return; } this.conn.query('UPDATE client SET ips_allowed = ? WHERE id = ?', [ips, client.id], (error, results, fields) => { if(error) { return this.conn.rollback(() => reject(error)); } this.conn.commit((error) => { if(error) { return this.conn.rollback(() => reject(error)); } this.conn.end(); }); });

    });
});

如果有人可以帮助我看到错误,我将非常感谢。就像我之前说过的,只有在交易中才会发生这种情况。

展开
收起
保持可爱mmm 2019-11-15 14:50:53 579 分享 版权
阿里云 AI 助理回答

这个错误信息表明你在尝试向MySQL数据库发送一个新的查询请求(enqueue Query),但是在此之前,你已经调用了quit方法来关闭了数据库连接。在Node.js中使用mysql库时,一旦调用了conn.end()conn.quit(),该连接就会被关闭,不能再执行任何新的查询。

从你的代码片段来看,问题可能出在事务处理完毕后直接调用this.conn.end()导致的。你应该确保在所有事务操作(包括commit和rollback)都完成之后,再关闭数据库连接。但根据你的描述,实际上并没有显示你在哪里调用了quit,因此这里的误导可能是由于对错误信息的理解不准确。

为了解决这个问题,你可以调整代码结构,确保在事务完全结束(无论是提交还是回滚)之后再关闭连接。这里是一个修改后的示例:

this.conn.connect(); 

return new Promise((resolve, reject) => {
    this.conn.beginTransaction((err) => {
        if(err) {
            reject(err);
            return;
        }
        
        // 执行更新查询
        this.conn.query('UPDATE client SET ips_allowed = ? WHERE id = ?', [ips, client.id], (error, results, fields) => {
            if(error) {
                // 回滚事务并关闭连接
                this.conn.rollback(() => {
                    this.conn.end(); 
                    reject(error);
                });
                return;
            }
            
            // 提交事务
            this.conn.commit((error) {
                if(error) {
                    // 如果提交失败,则回滚事务并关闭连接
                    this.conn.rollback(() => {
                        this.conn.end(); 
                        reject(error);
                    });
                    return;
                }
                
                // 成功提交事务后,关闭连接
                this.conn.end(); 
                resolve(results);
            });
        });
    });
});

这段代码改进了事务处理逻辑,确保在事务成功提交或因错误回滚之后,才调用this.conn.end()来关闭数据库连接。这样应该可以避免出现“Cannot enqueue Query after invoking quit”的错误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答