恐慌:解析 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
}
这是我在 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
}