如何在GitHub Action中让Sequelize连接测试MySQL数据库?
解决GitHub Action中Sequelize无法连接Docker MySQL的问题
你的错误日志已经给出了关键线索:hostname: '127.0.0.1:32574'——这说明你在Sequelize配置里把主机地址和端口号拼在了同一个字符串里,导致DNS解析时把带端口的完整字符串当作主机名去查询,自然会返回ENOTFOUND错误。
核心修复:拆分Sequelize的host与port配置
Sequelize要求host和port是两个独立的配置项,不能合并成一个字符串。错误的写法类似:
// ❌ 错误:把端口拼在host里 const sequelize = new Sequelize('test_db', 'root', 'password', { host: '127.0.0.1:32574', dialect: 'mysql' });
改成正确的拆分写法:
// ✅ 正确:host和port分开设置 const sequelize = new Sequelize('test_db', 'root', 'password', { host: '127.0.0.1', port: 32574, // 单独指定端口 dialect: 'mysql', // 可选:添加连接超时等配置,避免连接失败 dialectOptions: { connectTimeout: 10000 } });
GitHub Action环境的优化建议
如果你是通过Action的services字段定义MySQL服务(而非手动拉取Docker镜像),其实不需要手动映射端口到主机,直接用服务名作为host即可——因为Action的Job runner和服务容器处于同一个内部网络,可直接通过服务名访问:
示例Action配置(.github/workflows/test.yml)
jobs: test: runs-on: ubuntu-latest services: db: image: mysql:8.0 env: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: test_db # 提前创建测试数据库 options: >- --health-cmd="mysqladmin ping -ppassword" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Install dependencies run: npm install - name: Run tests run: npm test env: # 传递环境变量给Sequelize配置 DB_HOST: db DB_PORT: 3306 DB_USER: root DB_PASSWORD: password DB_NAME: test_db
对应的Sequelize配置可以用环境变量读取:
const sequelize = new Sequelize( process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, { host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT, 10), dialect: 'mysql' } );
额外排查步骤
- 验证配置正确性:在测试脚本开头打印Sequelize的配置,确认
host是纯IP/服务名,port是数字:console.log('Sequelize连接配置:', { host: sequelize.config.host, port: sequelize.config.port }); - 等待MySQL服务就绪:确保MySQL完全启动后再运行测试,可在Action中添加等待步骤:
- name: 等待MySQL服务启动 run: | until mysql --host ${{ env.DB_HOST }} --port ${{ env.DB_PORT }} -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }} -e "SELECT 1"; do echo "等待MySQL..." sleep 2 done
内容的提问来源于stack exchange,提问作者Endurs
相关产品推荐
相关产品推荐

