Node.js连接MySQL报错Error: Cannot enqueue Query after fatal error及认证问题的处理

Oliver
Oliver
发布时间:2026-10-15 | 6人浏览过
原创

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 命令行

  1. 打开 Windows 命令提示符(CMD),务必选择“以管理员身份运行”。
  2. 启动 MySQL 服务(若未自启动):
    net start mysql
  3. 登录数据库。假设用户名是 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 的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表