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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:07:37