Node.js连接MySQL报错Error: Cannot enqueue Query after fatal error及认证问题的处理
Node.js 连接 MySQL 数据库时,经常遇到 "Cannot enqueue Query after fatal error" 或 MySQL 8.0+ 的认证协议不兼容报错。本文提供针对性的配置修正与命令行修复方案,帮助快速恢复数据库连接。
解决 Cannot enqueue Query after fatal error
在使用 mysql 模块进行 Node.js 项目开发时,如果未正确启用连接池管理,数据库连接断开后再次发起查询可能会抛出 Error: Cannot enqueue Query after fatal error。这通常是因为连接对象处于不可用状态,但代码仍试图在其上执行操作。
解决方法:在数据库连接配置对象中添加 useConnectionPooling: true 参数,强制使用连接池来管理连接的生命周期。
第1步:安装依赖包
确保项目中已安装 mysql 模块并保存至依赖:
npm install mysql --save
第2步:创建数据库连接配置文件
建议新建一个 db.js 文件封装连接逻辑。以下代码不仅开启了连接池,还加入了断线自动重连机制,以提高连接的稳定性:
// db.js
const mysql = require('mysql');
// 数据库配置(务必开启 useConnectionPooling)
let dbconfig = {
host: 'db_host',
user: 'db_user',
password: 'db_pass',
database: 'db_name',
debug: true,
// 关键参数:启用连接池管理
useConnectionPooling: true
};
function handleDisconnection() {
db = mysql.createConnection(dbconfig);
db.connect(function (err) {
if (err) {
console.log('db connect error:' + err.message + " 2秒后重连");
setTimeout(handleDisconnection, 2000);
}
});
// 监听错误事件,处理断连并尝试恢复
db.on('error', function (err) {
console.log(err);
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
console.log('db error执行重连:' + err.message);
handleDisconnection();
} else {
throw err;
}
});
// 添加同步查询的简化方法
db.querySync = function(sql) {
return new Promise(function(resolve, reject) {
db.query(sql, function(error, results, fields) {
if(error) reject(error);
else resolve({results, fields})
})
})
};
return db;
}
// 导出连接实例
exports.db = handleDisconnection();
修改后,重新运行项目,该 fatal error 通常不再出现。连接池会自动处理空闲连接的重用与失效检测。
解决 MySQL 8.0+ 认证协议报错
当 Node.js 应用首次连接 MySQL 8.0 及以上版本时,可能会遭遇如下报错:
[SELECT ERROR] - ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
原因分析: MySQL 8.0 默认使用 caching_sha2_password 认证插件,而部分旧版 Node.js MySQL 驱动尚未完全支持该加密方式,导致握手阶段被拒绝。
解决方法:将 root 用户的认证方式切换回传统的 mysql_native_password 模式。
第1步:以管理员身份进入 MySQL 命令行
- 打开 Windows 命令提示符(CMD),务必选择“以管理员身份运行”。
- 启动 MySQL 服务(若未自启动):
net start mysql - 登录数据库。假设用户名是 root,密码是
123456:mysql -uroot -p123456
进入成功后,你将看到类似如下的界面提示:
第2步:修改认证插件
执行以下 SQL 语句,将 root 账户的认证方式改为兼容性更好的 mysql_native_password,并重新设置密码(此处示例为 123456,请替换为你的实际密码):
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
执行无误后,MySQL 会返回提示信息,表示用户信息已更新:
第3步:刷新权限并验证
最后,刷新权限表使更改立即生效:
flush privileges;
执行完成后的显示如下:
此时,退出 MySQL 命令行,重新启动你的 Node.js 应用,即可正常连接数据库,不再报认证协议错误。
总结
处理 Node.js 连接 MySQL 的异常主要分为两种思路:针对连接状态异常的 Cannot enqueue Query 错误,优化客户端配置(如启用连接池);针对底层协议不兼容的 ER_NOT_SUPPORTED_AUTH_MODE 错误,则需在服务端调整用户认证算法。掌握这两种排查手段,能有效提升全栈开发中数据库联调的效率。
以上就是 Node.js 连接 MySQL 时报错的处理办法的详细内容,更多关于 Node.js 连接 MySQL 的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









