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

我有一个我在 mongo 上设置的数据库,其中包含一些我需要通过端点的 url 参数查询的数据。为了使用这个库,我定义了一些句柄,并在一个单独的setup()函数中完成了数据库连接的整个设置,但是我不能在它之外使用我需要的句柄。


package main


import (

    "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 endpoint

type User struct {

    Email string `json:"email"`

}


// fake db to temp store users

var users []User


// checks if json is empty or not

func (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。因此,任何输入都不能在参数中。我尝试在全球范围内声明它们,但没有奏效,建议不要这样做。有人告诉我我可以尝试使用闭包或结构来传递它,但我也不太明白我将如何去做。


一只萌萌小番薯
浏览 81回答 1
1回答

临摹微笑

一种方法是这样,首先添加一个服务器类型type server struct {&nbsp; &nbsp; router *mux.Router&nbsp; &nbsp; cities *mongo.Collection}将路由包装器添加到服务器func (s *server) routes() {&nbsp; &nbsp; s.router.HandleFunc("/base", s.handleIndex()).Methods("GET")}处理函数func (s *server) handleIndex() http.HandlerFunc {&nbsp; &nbsp; return func(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp; &nbsp; &nbsp; cities := s.cities.Find(...) // something like that&nbsp; &nbsp; &nbsp; &nbsp; // write your response, etc&nbsp; &nbsp; }}然后在主func main() {&nbsp; &nbsp; sr := &server{&nbsp; &nbsp; &nbsp; &nbsp; router: mux.NewRouter(),&nbsp; &nbsp; &nbsp; &nbsp; cities: getMongoDBCollection('cities') // implement this one :) should return a *mongo.Collection...&nbsp; &nbsp; }&nbsp; &nbsp; sr.routes()...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go