我一直在为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(); }); });
});
});
如果有人可以帮助我看到错误,我将非常感谢。就像我之前说过的,只有在交易中才会发生这种情况。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个错误信息表明你在尝试向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”的错误。