Este es el error que recibo cuando docker-compongo mi aplicación en 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 +0x13dAquí está mi archivo 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) }Este es el archivo de la base de datos donde trato de hacer la conexión.
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) }archivo 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 }este es el archivo config.yaml .
environment: dev mongo: server: mongodb://mongo:27017 database: Mgo collection: ProductsRevisé la documentación oficial y algunos recursos, pero no pude encontrar una manera de manejar esto en el entorno de Golang . ¿Qué debo cambiar aquí?
En su función GetConfig() , declara una variable de tipo Configuration y la devuelve, pero en realidad nunca asigna nada a ninguno de sus campos. Es por eso que su llamada fmt.Println() para volcar la configuración solo muestra { { }} ; ninguno de los campos tiene valores asignados.
Debe descomponer la configuración de Viper en la estructura de configuración:
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 }