问题:
- 使用fastiy连接mysql一直连接失败,一直提示“Access denied for user 'xxx'@'xxx'”。
- 使用fastify-at-mysql插件连接数据库。
环境依赖
node:18.19.0
"@databases/mysql": "^6.0.0",
"fastify": "^4.0.0",
"fastify-at-mysql": "^0.4.0",
"fastify-cli": "^5.9.0",
"fastify-plugin": "^4.0.0",
mysql:5.7
可能问题点
- 密码不对
- 用户没权限,远程连接被拒绝
- 插件问题
排查问题
- 由于使用工具能连接上,并且配置,因此首先排除密码不对的问题。
- 排查远程主机没有开放连接权限
使用命令行工具本地连接:mysql -h 目标主机ip -P 3306 -uroot -p
参数说明(请确保本地安装了mysql,和目标主机版本要一致):
-h:主机ip (如:127.0.0.7)
-P:端口号 (注意大写,区别密码参数)
-u:mysql用户名 (可以不加空格)
-p:myql密码 (注意区分端口参数)
查看用户远程权限(由于我使用root用户连接,因此只过滤root用户):
select user,host from mysql.user where user = 'root';
查看host是否为“%”,如果为“%”或者和你主机一致,说明权限开启了。
提示连接成功,说明远程连接没问题。
- 那基本上判定为是插件的问题:
- 切换插件是否能连接上:
# 安装mysql测试连接
npm i mysql
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'your_host',
user: 'your_user',
password: 'your_password',
database: 'your_database'
});
connection.connect((err) => {
if (err) {
console.error('MySQL connection error:', err);
} else {
console.log('Connected to MySQL');
}
});
提示连接成功,说明是fastify-at-mysql的问题。
- 查找插件原因:
由于该插件依赖于:@databases/mysql,因此到官方文档查看连接配置: 发现连接中带"@"符号,而我连接目标机器的mysql数据库密码也带“@”符号,因此可能是特殊字符导致连接解析失败。
增加账户,并设置不带@符合的密码,测试运行成功。
解决方案
只需要密码不含“@”符号就可以解决了,后续等待插件方是否能解决适配该问题。