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

如何在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'
  }
);

额外排查步骤

  1. 验证配置正确性:在测试脚本开头打印Sequelize的配置,确认host是纯IP/服务名,port是数字:
    console.log('Sequelize连接配置:', {
      host: sequelize.config.host,
      port: sequelize.config.port
    });
    
  2. 等待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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:49:59