我有一个我在 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()
...
}
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报
0/150
提交
取消