使用Sequelize与Node.js连接MySQL Docker容器时遭遇HostNotFoundError问题求助
解决Sequelize连接Docker MySQL的HostNotFoundError问题
看起来你的问题核心出在环境变量文件格式错误,再加上可能的网络配置误解,咱们一步步来排查修复:
1. 先修复.env文件的格式问题
你的.env用了JavaScript对象的语法(冒号、逗号、引号),但.env的正确格式是KEY=VALUE纯键值对,不需要任何额外符号。错误格式会让dotenv解析出的变量带多余字符——比如MYSQL_HOST的值会是"localhost"(带引号),Sequelize会去解析一个叫"localhost"(带引号)的主机,自然找不到。
修正后的.env应该是这样:
MYSQL_DB=todos MYSQL_USERNAME=todo MYSQL_PASSWORD=s3cret MYSQL_HOST=localhost MYSQL_DIALECT=mysql MYSQL_PORT=3307
2. 验证环境变量是否正确读取
可以在db.config.js里先打印变量,确认解析后的数值是干净的:
const Sequelize = require('sequelize'); // 临时打印变量排查 console.log("MySQL Host:", process.env.MYSQL_HOST); console.log("MySQL Port:", process.env.MYSQL_PORT); const sequelize = new Sequelize(process.env.MYSQL_DB, process.env.MYSQL_USERNAME, process.env.MYSQL_PASSWORD, { host: process.env.MYSQL_HOST, dialect: process.env.MYSQL_DIALECT, operatorsAliases: 0, port: process.env.MYSQL_PORT, }); // ... 其余代码
如果打印的host带引号,说明.env的格式问题还没解决。
3. 针对网络场景的补充调整
场景A:Node.js在宿主机运行(非Docker容器)
你的Docker Compose已经把MySQL的3306端口映射到宿主机3307,只要.env修复完成,用localhost:3307就能正常连接。
场景B:Node.js也在Docker容器运行
如果你的Node服务也是用Docker Compose启动的,需要做两个调整:
- 把Node服务加入
mysql_app网络 - 连接MySQL时,host用服务名
mysql,端口用内部端口3306(容器间通信走内部端口,不需要宿主机映射端口)
示例docker-compose.yml新增Node服务:
services: # ... 现有mysql服务 node-app: build: . # 假设你的Node项目有Dockerfile environment: <<: *common-variables MYSQL_HOST: mysql MYSQL_PORT: 3306 ports: - "8080:8080" networks: - mysql_app depends_on: - mysql
4. 额外排查点
- 确认MySQL容器在运行:执行
docker ps查看容器状态,确保是Up状态 - 测试宿主机端口是否开放:用
telnet localhost 3307或nc -zv localhost 3307验证端口连通性 - 检查hosts文件:确保
127.0.0.1 localhost的映射没有被错误修改
按照这些步骤调整后,应该就能解决HostNotFoundError的问题了。
内容的提问来源于stack exchange,提问作者bhamam
相关产品推荐
相关产品推荐

