部署AdonisJS到DigitalOcean时MySQL正确凭据仍被拒绝访问如何解决
问题修复步骤
1. 校验MySQL用户权限匹配规则
MySQL中localhost和127.0.0.1是完全独立的权限主体,你的.env配置里用的是MYSQL_HOST=127.0.0.1,如果创建用户时只授权了noble@localhost,就会触发访问拒绝报错。
执行以下命令确认用户权限:
SELECT user, host, plugin FROM mysql.user WHERE user='noble';
如果查询结果里只有host为localhost的记录,执行以下命令补充127.0.0.1的授权,同时指定mysql_native_password插件:
CREATE USER 'noble'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '你的实际数据库密码'; GRANT ALL PRIVILEGES ON adonisapp.* TO 'noble'@'127.0.0.1'; FLUSH PRIVILEGES;
2. 确认Adonis数据库配置未覆盖环境变量
检查项目config/database.ts(AdonisJS v5/v6)或config/database.js(v4)中的mysql连接配置,确保字段和.env变量完全对应,没有硬编码值覆盖:
// 正确配置示例(v5/v6) mysql: { client: 'mysql2', connection: { host: env.get('MYSQL_HOST'), port: env.get('MYSQL_PORT'), user: env.get('MYSQL_USER'), password: env.get('MYSQL_PASSWORD'), database: env.get('MYSQL_DB_NAME'), } }
如果使用的是旧版mysql驱动而非mysql2,需要额外在配置中添加auth插件参数适配mysql_native_password:
connection: { // 其他配置不变 authPlugins: { mysql_native_password: () => require('mysql2/lib/auth_plugins/mysql_native_password'), } }
3. 本地连接有效性测试
直接在服务器命令行用和.env完全一致的参数测试连接,排除数据库侧问题:
mysql -h 127.0.0.1 -P 3306 -u noble -p adonisapp
输入密码后如果能正常进入数据库,说明数据库侧配置正常,问题出在Adonis项目配置;如果仍报错,继续排查以下项:
- 检查MySQL配置文件
my.cnf(通常在/etc/mysql/或/etc/目录下),确认bind-address没有只绑定公网IP,skip-networking参数未开启 - 如果服务器使用CentOS/RHEL系发行版,执行
setsebool -P httpd_can_network_connect_db 1关闭SELinux对数据库连接的限制
4. 缓存清理
配置修改后执行以下命令清理Adonis的环境缓存,避免旧配置生效:
node ace config:clear node ace cache:clear # 生产环境需要重启服务 pm2 restart 你的Adonis服务名
内容的提问来源于stack exchange,提问作者Noble Eugene
相关产品推荐
相关产品推荐

