You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下MySQL客户端认证协议不兼容,数据无法写入数据库求助

解决Docker环境中MySQL认证模式错误及数据写入失败问题

核心问题分析

你遇到的ER_NOT_SUPPORTED_AUTH_MODE错误,本质是MySQL 8.0默认使用caching_sha2_password认证插件,但你的Node.js MySQL客户端版本不支持该插件。同时服务端无法写入数据库,还有环境变量配置遗漏的问题。

具体修复步骤

1. 补充缺失的数据库用户环境变量

你的server.js中使用了process.env.MYSQL_USER,但docker-compose.yml的通用变量里未定义该值,导致数据库连接的用户名是undefined。修改x-common-variables块:

x-common-variables: &common-variables
  MYSQL_ROOT_PASSWORD: root
  MYSQL_DATABASE: shimshon
  MYSQL_USER: root  # 添加该行,使用root用户连接,也可创建专门的业务用户
  MYSQL_HOST_IP: localhost
  REACT_APP_SERVER_PORT: 3001

2. 确认MySQL服务的认证插件配置生效

你已在mysql服务的command中指定--default-authentication-plugin=mysql_native_password,可通过以下步骤验证:

  • 进入mysql容器执行命令:
docker exec -it <mysql容器名> mysql -uroot -proot
  • 查看用户认证插件:
SELECT user, plugin FROM mysql.user WHERE user='root';

若plugin显示为mysql_native_password则配置生效,否则重启mysql容器:

docker-compose restart mysql

3. 完善数据库连接代码的错误处理

在server.js中添加连接错误处理,方便排查问题:

const db = mysql.createConnection({
  host: process.env.MYSQL_HOST_IP,
  user: process.env.MYSQL_USER,
  password: process.env.MYSQL_ROOT_PASSWORD,
  database: process.env.MYSQL_DATABASE,
  port : 3306
});

db.connect((err) => {
  if (err) {
    console.error('数据库连接失败:', err);
    return;
  }
  console.log('数据库连接成功');
});

4. 验证数据库初始化脚本

确保./db/sample.sql中的表结构无语法错误且已正确创建。可通过phpMyAdmin访问http://localhost:8080,用root/root登录,检查shimshon数据库内的表是否存在。

5. 优化服务启动依赖逻辑

虽然server服务配置了depends_on: [mysql],但Docker仅保证mysql容器启动,不保证数据库服务完全就绪。可以在server的启动命令前添加等待脚本,或在代码中使用连接池替代单连接(如mysql.createPool),利用自动重连机制规避启动时序问题。

内容的提问来源于stack exchange,提问作者Tal Roz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:45:35