Node.js使用mysql包执行查询时遭遇connect ETIMEDOUT异常求助
解决Node.js mysql包连接超时(connect ETIMEDOUT)问题
看到你遇到了connect ETIMEDOUT错误,这个问题本质是你的Node.js客户端无法在规定时间内和目标MySQL服务器建立网络连接——和你写的SQL语句、目标表是否存在无关,毕竟连都没连上,还没到执行查询的阶段。下面给你几个排查和解决的具体步骤:
先排查网络连通性
先确认你的机器能不能正常访问10.90.103.4这个服务器:- 用ping命令测试:
ping 10.90.103.4,如果丢包或者完全不通,说明是网络链路问题(比如防火墙拦截、VPC网络隔离、服务器宕机),得先解决网络层面的问题。 - 测试MySQL端口是否开放:默认MySQL端口是3306,Windows可以用PowerShell执行
Test-NetConnection 10.90.103.4 -Port 3306,Linux/macOS用nc -zv 10.90.103.4 3306,如果提示无法连接,大概率是服务器端防火墙挡住了3306端口,或者MySQL服务没监听这个端口。
- 用ping命令测试:
检查MySQL用户的连接权限
MySQL默认会限制用户的连接来源,比如someuser可能只允许从localhost或者特定IP连接,你的客户端IP不在允许列表里也会导致连接失败(表现为超时或拒绝连接)。
登录到MySQL服务器,执行以下命令查看用户权限:SELECT user, host FROM mysql.user;如果
someuser对应的host不是你的客户端IP或者%(允许任意IP,生产环境不建议使用),就需要给用户授权:GRANT ALL PRIVILEGES ON db.* TO 'someuser'@'你的客户端IP' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;完善连接配置参数
你的连接配置里可能缺了一些关键参数:- 如果MySQL服务不是用默认的3306端口,一定要加上
port参数; - 可以适当延长连接超时时间,避免因为网络延迟导致超时。修改后的配置示例:
var mysql = require('mysql'); var con = mysql.createConnection({ host: "10.90.103.4", user: "someuser", password: "********", database: "db", port: 3306, // 非默认端口时修改为实际端口 connectTimeout: 10000 // 延长到10秒,默认超时时间较短 });- 如果MySQL服务不是用默认的3306端口,一定要加上
确认MySQL服务状态
登录到目标服务器,检查MySQL服务是否正常运行:- Linux系统:
systemctl status mysql - Windows系统:打开服务管理器,找到MySQL服务查看是否处于运行状态
- Linux系统:
按照上面的步骤一步步排查,应该能快速定位到问题所在。
内容的提问来源于stack exchange,提问作者johny
相关产品推荐
相关产品推荐

