【问题标题】:Error: Cannot enqueue Query after fatal error. Expressjs. Mysql错误:致命错误后无法将查询排入队列。快递。 mysql
【发布时间】:2019-03-17 05:17:59
【问题描述】:

我的 Express js 连接到多个数据库。每次我启动我的应用程序时都有效。但是,一旦我与数据库的连接过时......连接就会返回错误代码PROTOCOL_CONNECTION_LOST。当连接空闲时,这对于 mysql 来说是正常的。我的 mysql 服务器部署在 AWS RDS 中,它也可以正常工作。

问题是,每次我的 express 应用遇到PROTOCOL_CONNECTION_LOST 错误,它都应该重新连接到数据库,这实际上也是有效的。但是当我尝试对我的 MYSQL 数据库进行查询时。它返回一个Error: Cannot enqueue Query after fatal error. 错误。我已经处理了一段时间,我的解决方法是每次都重新启动 express 应用程序。希望其他人遇到过这种情况并可以提供建议。

这是我连接数据库的示例代码:

var mysql = require('mysql');
var mysqlConn
// mysqlConn.connect();

function handleDisconnect() {
    mysqlConn = mysql.createConnection({
        host: 'aws_instance***',
        user: '******',
        password: '*****',
        database: 'my_db',
        multipleStatements: true
    });

    mysqlConn.connect(function (err) {
        if (err) {
            console.log('ERROR CONNECT admin:', err.code + '--' + err.address);
            setTimeout(handleDisconnect, 2000);
        } else {
            console.log('Connected to DB')
        }
    });

    mysqlConn.on('error', function (err) {
        console.log('ERROR admin', err.code + '--' + err.address);
        if (err.code === 'PROTOCOL_CONNECTION_LOST') {   // Connection to the MySQL server is usually
            console.log("Connection to db lost!")
            handleDisconnect();                         // lost due to either server restart, or a
        } else {    
            console.log(err)                                  // connnection idle timeout (the wait_timeout
            throw err;                                  // server variable configures this)
        }
    });

}

handleDisconnect();
module.exports = {
    mysqlConn: mysqlConn,
};

然后这是我的输出日志,如我的服务器日志中所示。

ERROR db PROTOCOL_CONNECTION_LOST--undefined
Connection to db lost!
Connected to db
OPTIONS /verify-token/ 200 0.285 ms - 4
Error: Cannot enqueue Query after fatal error.
POST /verify-token/ 500 1.332 ms - 95
OPTIONS /auth/login 200 0.793 ms - 4
Error: Cannot enqueue Query after fatal error.
POST /login 500 1.564 ms - 58
OPTIONS /login 200 0.687 ms - 4
Error: Cannot enqueue Query after fatal error.
POST /login 500 1.467 ms - 58

【问题讨论】:

    标签: mysql node.js express


    【解决方案1】:

    虽然有workarounds,但显然是don't work for everyone。文档中的建议是use connection pooling,而不是手动管理单个连接。

    【讨论】:

    • 我可能会改用连接池。我还没有尝试过,因为我需要一天的时间来测试它,因为我必须等待PROTOCOL_CONNECTION_LOST 生效,而且我不想修改我的数据库,因为我知道我们网站的其他功能'重新开发正在使用它。不过还是谢谢。
    • 假设您已经或可以设置开发环境,我会尝试设置一个触发此错误的临时端点,可能是通过弄乱连接对象(只是关闭它可能会起作用,除非导致另一个错误)。但实际上,无论如何,连接池可能是比这更好的选择。如果没有开发环境...向你们这些美丽的西班牙女士们告别...
    • 在 ubuntu 上,模拟断开连接,sudo service mysql restart
    猜你喜欢
    • 2016-08-03
    • 2016-10-03
    • 2017-06-19
    • 1970-01-01
    • 2016-12-25
    • 2018-05-18
    • 2015-10-11
    • 2020-03-10
    • 1970-01-01
    相关资源
    最近更新 更多