亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在另一個函數中使用已連接到我的 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 關注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號