Error: Handshake inactivity timeout in Node.js MYSQL module

Error: Handshake inactivity timeout in Node.js MYSQL module

我正在使用 node-mysql 和大多数查询。在职的。一些查询不起作用。 我尝试了每个版本的 Node(从 0.5 ...)到(5.6.0),我也尝试了(4.0)和(4.1),没有任何帮助。

我尝试手动更改,但没有成功。我试图将 sequence 文件更改为:this._idleTimeout = -1; 但没有帮助。

我阅读了这些问题并 GitHub,但没有任何帮助。

我可以尝试自己修复它,但我需要更多信息。超时在哪里,为什么?什么时候?这种消息是什么?超时从何而来?

MYSQL_ERROR     { [Error: Handshake inactivity timeout]  
code: 'PROTOCOL_SEQUENCE_TIMEOUT',   fatal: true,   
timeout: 10000 }  

好的,超时来自Protocol.js文件line:162。如果你检查 node-mysql 你会看到它是查询的变量“超时”。如果您将超时设置为比默认值 10000 高很多的值,那么错误应该会消失。一个例子是

pool = require('mysql').createPool({
    connectionLimit : 1000,
    connectTimeout  : 60 * 60 * 1000,
    acquireTimeout  : 60 * 60 * 1000,
    timeout         : 60 * 60 * 1000,
    host            : process.env.DB_HOST,
    user            : process.env.DB_USERNAME,
    password        : process.env.DB_PASSWORD,
    database        : process.env.DB_DATABASE
});

您还可以在 Sequence.js 文件 (node_modules/mysql/lib/protocol/sequences/Sequence.js)

中编辑超时
this._timeout  = 100000;

如果您使用的是亚马逊的服务,我可以通过更改安全设置中允许的 IP 地址来解决此问题通过更改打开的连接端口。

对于在 AWS 上部署并遇到此错误的用户,您需要更改 database/cluster 和 add an inbound rule 的安全组,其中 source 是您 instance/s 的 安全组。

入站规则应如下所示:

Type: MySQL/Aurora
Protocol: TCP (default)
Port: 3306 (default)
Source: <security group of instance>
Description: <optional>

对于那些部署在 aws 和 heroku 上的人!输入 rds 数据库实例设置并更改入站规则 --> source: any..

Heroku 不提供特定的 ip,记住!

.end() 是非阻塞的,但这可能会导致您的代码遇到与我相同的问题 - 我只是调用 .end() w/o 等待操作实际完成。

要真正等待连接结束,您不能只等待 dbConn.end(),因为 .end() 没有 return 承诺。您需要的是创建一个承诺并 return 它。像下面这样:

来自

connection.end();

对此

connection.end(error => error ? reject(error) : resolve());

并且对于池使用

connection.release();

对此

connection.release(error => error ? reject(error) : resolve());

对我来说,将 'select' 语句更正为 select,其中检查 ID 列(主键)而不是类型为 varchar 的列,例如: 不工作

select from users where userName = 'aa';

工作

select from users where userID = 1;

对于连接到 Amazon RDS 和 EC2 的那些,更改 RDS 和 EC2 实例的入站规则。 即 RDS 应该允许新的 IPv4 而 EC2 应该允许 MySQL/Aurora.