Facebook|Facebook:如何在Golang中搭建GraphQL?( 四 )
repository.go
package bookimport("context""log""graphql/infrastructure""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/mongo/options")funcGetBookByName(ctxcontext.Context, name string) (result interface{}){var book Bookdata :=infrastructure.Mongodb.Collection("booklist").FindOne(ctx,bson.M{"name": name})data.Decode(&book)return book}funcGetBookList(ctxcontext.Context, limit int) (result interface{}){var book Bookvar books []Bookoption := options.Find().SetLimit(int64(limit))cur, err:= infrastructure.Mongodb.Collection("booklist").Find(ctx, bson.M{},option)defer cur.Close(ctx)if err != nil {log.Println(err)return nil}for cur.Next(ctx) {cur.Decode(&book)books = append(books, book)}return books}funcInsertBook(ctxcontext.Context, book Book) error {_, err :=infrastructure.Mongodb.Collection("booklist").InsertOne(ctx, book)return err}funcUpdateBook(ctxcontext.Context, book Book) error {filter := bson.M{"name":book.Name}update := bson.M{"$set":book}upsertBool := trueupdateOption := options.UpdateOptions{Upsert: &upsertBool,}_, err :=infrastructure.Mongodb.Collection("booklist").UpdateOne(ctx, filter,update, &updateOption)return err}funcDeleteBook(ctxcontext.Context, name string) error {_, err :=infrastructure.Mongodb.Collection("booklist").DeleteOne(ctx,bson.M{"name": name})return err}
response.go
package bookimport("encoding/json""net/http""time")type SetResponsestruct {Statusstring`json:"status"`Datainterface{} `json:"data,omitempty"`AccessTime string`json:"accessTime"`}funcHttpResponseSuccess(w http.ResponseWriter, r *http.Request, data interface{}){setResponse := SetResponse{Status:http.StatusText(200),AccessTime: time.Now().Format("02-01-2006 15:04:05"),Data:data}response, _ :=json.Marshal(setResponse)w.Header().Set("Content-Type", "Application/json")w.WriteHeader(200)w.Write(response)}funcHttpResponseError(w http.ResponseWriter, r *http.Request, data interface{},code int) {setResponse := SetResponse{Status:http.StatusText(code),AccessTime: time.Now().Format("02-01-2006 15:04:05"),Data:data}response, _ :=json.Marshal(setResponse)w.Header().Set("Content-Type", "Application/json")w.WriteHeader(code)w.Write(response)}
routes.go
package bookimport("github.com/go-chi/chi""github.com/go-chi/chi/middleware""github.com/graphql-go/handler")funcRegisterRoutes(r *chi.Mux) *chi.Mux {/* GraphQL */graphQL := handler.New(&handler.Config{Schema:&Schema,Pretty:true,GraphiQL: true,})r.Use(middleware.Logger)r.Handle("/query", graphQL)return r}
最后 , 创建名为 main.go的文件 。
main.go
package mainimport("github.com/go-chi/chi""graphql/book""graphql/infrastructure""log""net/http""net/url")funcmain() {routes := chi.NewRouter()r := book.RegisterRoutes(routes)log.Println("Server ready at 8080")log.Fatal(http.ListenAndServe(":8080", r))}funcinit() {val := url.Values{}val.Add("parseTime", "1")val.Add("loc", "Asia/Jakarta")env := infrastructure.Environment{}env.SetEnvironment()env.LoadConfig()env.InitMongoDB()}
运行程序的结果如下:
推荐阅读
- 穿鞋子的喵|如何在RTSP协议视频智能平台EasyNVR未登录的情况下调用通道直播的接口?
- FMARTS福玛仕办公家具|如何在网上挑选办公家具
- |B端运营,如何在渠道运营中获得主动权?
- 飞舞的鸢尾草|如何在Mac的Dock中添加AirDrop快捷方式如何将AirDrop添加到Mac的Dock
- 环球网|亮出全新智慧计算战略 新华三豪言要做“最强”的底气何在
- 识别|两元钱买到上千张人脸照片 人脸识别应用边界何在
- 农产品|补齐生态版图 五岁拼多多如何在新农村战略中“拼”出新天地?
- |教程 | 普通人如何在家运行以太坊2.0节点
- |如何在开关模式电源印刷电路板上放置电感
- Facebook|三星,苹果最好的损友!从3GS损到iPhone 12从不留情
