为了账号安全,请及时绑定邮箱和手机立即绑定

如何在另一个函数中使用已连接到我的 mongodb 和集合的句柄?

如何在另一个函数中使用已连接到我的 mongodb 和集合的句柄?

Go
一只萌萌小番薯 2022-10-17 19:16:15
我有一个我在 mongo 上设置的数据库,其中包含一些我需要通过端点的 url 参数查询的数据。为了使用这个库,我定义了一些句柄,并在一个单独的setup()函数中完成了数据库连接的整个设置,但是我不能在它之外使用我需要的句柄。package mainimport (    "context"    "encoding/json"    "fmt"    "log"    "net/http"    "time"    "github.com/gorilla/mux"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options"    "go.mongodb.org/mongo-driver/mongo/readpref")func setup() {    clientOptions := options.Client().        ApplyURI("mongodb+srv://<username>:<password>@cluster0.um5qb.mongodb.net/<db>?retryWrites=true&w=majority")    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)    defer cancel()    client, err := mongo.Connect(ctx, clientOptions)    if err != nil {        log.Fatal(err)    }    err = client.Ping(ctx, readpref.Primary())    if err != nil {        log.Fatal(err)    }    defer client.Disconnect(ctx)    // DB := client.Database("cities-nighthack")    // Cities := DB.Collection("city")}// model for user endpointtype User struct {    Email string `json:"email"`}// fake db to temp store usersvar users []User// checks if json is empty or notfunc (u *User) IsEmpty() bool {    return u.Email == ""}type App struct {    Mongo *mongo.Client}func main() {    setup()    r := mux.NewRouter()    r.HandleFunc("/user", createUser).Methods("POST")    // r.HandleFunc("/suggest?city_name={city}", searchCity).Methods("GET")    fmt.Println("Server running at port 8080")    log.Fatal(http.ListenAndServe(":8080", r))}func createUser(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "application/json")    if r.Body == nil {        json.NewEncoder(w).Encode("Must send data")    }但是, gmux 不允许您这样做,因为它隐式传入http.ResponseWriter和 a *http.Request。因此,任何输入都不能在参数中。我尝试在全球范围内声明它们,但没有奏效,建议不要这样做。有人告诉我我可以尝试使用闭包或结构来传递它,但我也不太明白我将如何去做。
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

一种方法是这样,首先添加一个服务器类型


type server struct {

    router *mux.Router

    cities *mongo.Collection

}

将路由包装器添加到服务器


func (s *server) routes() {

    s.router.HandleFunc("/base", s.handleIndex()).Methods("GET")

}

处理函数


func (s *server) handleIndex() http.HandlerFunc {

    return func(w http.ResponseWriter, r *http.Request) {

        cities := s.cities.Find(...) // something like that

        // write your response, etc

    }

}

然后在主


func main() {

    sr := &server{

        router: mux.NewRouter(),

        cities: getMongoDBCollection('cities') // implement this one :) should return a *mongo.Collection...

    }

    sr.routes()

...

}


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信