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.
我正在使用 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.