恐慌:解析 uri 时出错:方案必须是 "mongodb" 或 "mongodb+srv" Golang - MongoDB 连接错误

panic: error parsing uri: scheme must be "mongodb" or "mongodb+srv" Golang - MongoDB connection error

这是我在 docker-compose up 我的应用程序 docker-desktop.

时遇到的错误
{ { }}
panic: error parsing uri: scheme must be "mongodb" or "mongodb+srv"
goroutine 1 [running]:
go-products/database.ConnectDB(0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
/app/database/database.go:15 +0x145
main.main()
/app/main.go:14 +0x13d

这是我的main.go文件

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "go-products/config"
    "go-products/database"
    "net/http"
)

func main() {
    conf := config.GetConfig()
    fmt.Println(conf)
    db := database.ConnectDB(conf.Mongo)
    fmt.Println(db)
    r := mux.NewRouter()
    http.ListenAndServe(":8080", r)
}

这是我尝试建立连接的数据库文件。

package database

import (
    "context"
    "go-products/config"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func ConnectDB(conf config.MongoConfiguration) *mongo.Database {
    connection := options.Client().ApplyURI(conf.Server)
    client, err := mongo.Connect(context.TODO(), connection)

    if err != nil {
        panic(err)
    }

    return client.Database(conf.Database)
}

config.go 文件

package config

import "github.com/spf13/viper"

type Configuration struct {
    Environment string
    Mongo       MongoConfiguration
}

type MongoConfiguration struct {
    Server string
    Database string
    Collection string
}

func GetConfig() Configuration {
    conf := Configuration{}
    viper.SetConfigName("config")
    viper.SetConfigType("yml")
    viper.AddConfigPath("./config")

    err := viper.ReadInConfig()
    if err != nil {
        panic(err)
    }

    return conf
}

这是config.yaml文件。

environment: dev
mongo:
  server: mongodb://mongo:27017
  database: Mgo
  collection: Products

我查看了官方文档和一些资源,但找不到在 Golang 环境中处理此问题的方法。我应该在这里更改什么?

在您的 GetConfig() 函数中,您声明了一个类型为 Configuration 的变量,并且您 return 它,但实际上您从未将任何内容分配给它的任何字段。这就是为什么您的 fmt.Println() 转储配置的调用只显示 { { }}; none 个字段已分配值。

您需要unmarshal将 Viper 配置到配置结构中:

func GetConfig() (Configuration, error) {
    var conf Configuration
    // ... viper setup ...

    err := viper.ReadInConfig()
    if err != nil {
        return Configuration{}, err
    }

    // *** unmarshal the Viper config into the Configuration struct ***
    err = viper.Unmarshal(&conf)
    if err != nil {
        return Configuration{}, err
    }
    // ***

    return conf, nil
}