Fastify fastify-at-mysql 连接远程Mysql填坑记

90 阅读2分钟

问题:

  • 使用fastiy连接mysql一直连接失败,一直提示“Access denied for user 'xxx'@'xxx'”。
  • 使用fastify-at-mysql插件连接数据库。

image.png

环境依赖

image.png

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是否为“%”,如果为“%”或者和你主机一致,说明权限开启了。

image.png

image.png

提示连接成功,说明远程连接没问题。

  • 那基本上判定为是插件的问题:
  1. 切换插件是否能连接上:
# 安装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');
  }
});

image.png

提示连接成功,说明是fastify-at-mysql的问题。

  1. 查找插件原因:

由于该插件依赖于:@databases/mysql,因此到官方文档查看连接配置: 发现连接中带"@"符号,而我连接目标机器的mysql数据库密码也带“@”符号,因此可能是特殊字符导致连接解析失败。

image.png

image.png

增加账户,并设置不带@符合的密码,测试运行成功。

解决方案

只需要密码不含“@”符号就可以解决了,后续等待插件方是否能解决适配该问题。