使用Sequelize连接远程MySQL报connect ECONNREFUSED错误如何解决?
问题诱因
- 远程MySQL服务未正常启动,或未监听你配置的数据库端口(默认3306)
- 远程服务器的防火墙、安全组未开放对应数据库端口的入站访问规则
- MySQL默认配置
bind-address为127.0.0.1,仅允许本地连接,未修改为支持外部IP访问 - 你的配置文件中
DB_HOST、数据库端口参数填写错误,若使用非默认3306端口未在代码中显式声明 - 所用数据库账号仅允许本地登录,未授权你当前设备的公网IP访问权限
- 你当前的网络环境存在限制,比如公司、校园内网封禁了对外的MySQL端口连接请求
排查解决步骤
- 核对基础配置信息
确认你配置文件中的DB_HOST、DB_USER、DB_PASSWORD、数据库端口信息与远程数据库提供方给出的参数完全一致,无多余空格、大小写错误。如果使用非3306的自定义端口,需要在Sequelize配置中显式补充port参数:
export const DB = new Sequelize(DB_NAME, DB_USER, DB_PASSWORD, { host: DB_HOST, port: 你的自定义端口, // 新增这行配置 dialect: "mysql", // 剩余原有配置保持不变 })
- 排查网络连通性
在本地终端执行telnet 数据库IP 数据库端口命令测试网络连通性,如果提示连接失败,说明是网络层面问题,和代码无关:
此时需要先检查远程服务器的安全组、防火墙规则,确认已开放对应数据库端口的入站权限,可临时放开所有IP访问测试是否恢复。
检查远程MySQL服务配置
登录远程服务器后,首先确认MySQL服务状态正常,可执行systemctl status mysql(Linux系统)查看运行状态。其次找到MySQL的配置文件(my.cnf/my.ini),确认bind-address参数配置为0.0.0.0或者你本地的公网IP,修改配置后需要重启MySQL服务生效。核对数据库账号权限
登录远程MySQL后执行如下SQL查看账号允许访问的IP范围:
SELECT user, host FROM mysql.user WHERE user = '你的数据库用户名';
如果查询结果中host字段为localhost,需要给账号授权外部访问权限:
-- 授权指定IP访问,生产环境推荐使用该方式 GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的数据库用户名'@'你本地的公网IP' IDENTIFIED BY '你的数据库密码'; -- 如果临时测试可以授权所有IP访问,生产环境不建议使用 -- GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的数据库用户名'@'%' IDENTIFIED BY '你的数据库密码'; FLUSH PRIVILEGES;
配置修改完成后重启你的Node服务,再次测试数据库连接即可。
内容的提问来源于stack exchange,提问作者walexy
相关产品推荐
相关产品推荐

