Node.js连接MySQL报ER_ACCESS_DENIED_ERROR且连接IP异常问题求助
问题原因及解决方案
陌生IP的来源
MySQL报错Access denied for user '****'@'112.200.198.66'中的IP地址,不是你要连接的目标MySQL服务的IP,而是发起连接请求的Node.js程序所在机器的公网出口IP,你对报错字段的含义理解有误,才会觉得这个IP陌生。
排查步骤
- 先确认.env配置是否正确加载
绝大多数同类问题都是因为没有正确加载.env文件导致的:你需要先安装dotenv依赖,并且在项目入口文件最顶部添加require('dotenv').config()代码,才能让process.env读取到.env中的配置。可以在mysql.createPool执行前打印所有数据库相关的环境变量,确认读取的数值和你配置的一致:console.log('MYSQL_HOST:', process.env.MYSQL_HOST) console.log('MYSQL_USER:', process.env.MYSQL_USER) console.log('MYSQL_PORT:', process.env.MYSQL_PORT) console.log('MYSQL_PASSWORD:', process.env.MYSQL_PASSWORD) - 确认密码配置正确性
检查.env中的数据库密码和Workbench使用的密码完全一致,.env文件中的密码不要加多余的单双引号,避免转义问题导致实际传入的密码错误。 - 验证Node.js程序所在机器的出口IP
在运行Node.js程序的机器上执行命令curl ifconfig.me,查看输出的公网IP是否和报错中的112.200.198.66一致,就能确认是不是该机器的出口IP。 - 检查MySQL账号的授权规则
你之前用MySQL Workbench可以正常连接,说明该账号的授权规则只允许Workbench所在机器的IP访问,没有放开Node.js所在机器的IP访问权限。
解决方法
- 如果确认报错中的IP就是Node.js机器的出口IP,登录MySQL服务端执行授权命令即可:
测试环境如果不想固定IP,可以把IP换成通配符GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'112.200.198.66' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;%允许所有IP访问,生产环境不推荐该操作。 - 如果确认出口IP和报错IP不一致,检查运行Node.js的机器的hosts配置,是否有把MySQL域名错误解析到其他地址,同时检查项目代码中是否有其他地方覆盖了数据库连接的配置参数。
内容的提问来源于stack exchange,提问作者Ralph Stephen Bernal Jularbal
相关产品推荐
相关产品推荐

