This is the error I am getting when I docker-compose up my app in 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
Here is my main.go file
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)
}
This is the database file where I try to make connection.
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 file
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
}
this is config.yaml file.
environment: dev
mongo:
server: mongodb://mongo:27017
database: Mgo
collection: Products
I have checked the official documentation and some resources but couldn't find a way to handle this in Golang environment. What should I change here?
In your GetConfig() function, you declare a variable of type Configuration, and you return it, but you never actually assign anything to any of its fields. That's why your fmt.Println() call to dump out the configuration just shows { { }}; none of the fields have assigned values.
You need to unmarshal the Viper configuration into the config structure:
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
}