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

无法在Heroku部署Go后端应用:MySQL连接被拒求助

Go应用部署Heroku失败:MySQL连接被拒绝

问题详情

  • Procfile内容:
    web: studentData
    
  • 应用启动时反复出现以下错误,导致进程退出、应用崩溃(返回H10错误):
    dial tcp 127.0.0.1:3306: connect: connection refused
    

问题根源

你的Go应用硬编码了本地MySQL连接地址(127.0.0.1:3306),但Heroku运行环境中没有本地MySQL服务。必须使用Heroku提供的数据库附加组件,并通过环境变量读取数据库连接参数。

解决步骤

  1. 添加Heroku数据库附加组件
    通过Heroku CLI安装ClearDB(MySQL兼容):

    heroku addons:create cleardb:ignite
    

    也可以登录Heroku控制台,手动添加ClearDB或Heroku MySQL插件。

  2. 修改数据库连接逻辑
    移除硬编码的连接信息,读取Heroku提供的环境变量:

    • ClearDB使用CLEARDB_DATABASE_URL
    • Heroku MySQL使用DATABASE_URL
      示例代码:
    import (
        "database/sql"
        "fmt"
        "net/url"
        "os"
        _ "github.com/go-sql-driver/mysql"
    )
    
    func initDB() (*sql.DB, error) {
        // 优先读取ClearDB,其次是Heroku MySQL的环境变量
        dbURL := os.Getenv("CLEARDB_DATABASE_URL")
        if dbURL == "" {
            dbURL = os.Getenv("DATABASE_URL")
        }
    
        // 解析数据库URL
        u, err := url.Parse(dbURL)
        if err != nil {
            return nil, fmt.Errorf("failed to parse DB URL: %w", err)
        }
    
        username := u.User.Username()
        password, _ := u.User.Password()
        host := u.Host
        dbName := u.Path[1:] // 移除路径开头的斜杠
    
        // 构建MySQL DSN
        dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", username, password, host, dbName)
        db, err := sql.Open("mysql", dsn)
        if err != nil {
            return nil, fmt.Errorf("failed to open DB: %w", err)
        }
    
        // 验证连接
        if err := db.Ping(); err != nil {
            return nil, fmt.Errorf("failed to ping DB: %w", err)
        }
    
        return db, nil
    }
    
  3. 确保应用监听正确端口
    Heroku通过PORT环境变量指定应用监听端口,不能硬编码:

    import (
        "log"
        "net/http"
        "os"
    )
    
    func main() {
        port := os.Getenv("PORT")
        if port == "" {
            port = "8080" // 本地开发默认端口
        }
    
        // 初始化路由等逻辑...
    
        log.Printf("Starting server on :%s", port)
        if err := http.ListenAndServe(":"+port, nil); err != nil {
            log.Fatalf("Server failed to start: %v", err)
        }
    }
    
  4. 重新部署应用
    提交代码修改后重新部署:

    git add .
    git commit -m "fix: use Heroku database env vars and dynamic port"
    git push heroku main
    

验证

部署完成后,通过日志确认连接状态:

heroku logs --tail

内容的提问来源于stack exchange,提问作者Arjun Malhotra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:45:31