Использование двух обработчиков для проекта GraphQL; обрабатывать запрос вторым, если первый не может
Я пытаюсь использовать как SuperGraph как библиотеку, так и GqlGen.
Итак, у меня есть два обработчика:
первый - SuperGraph; это проверяет, может ли он выполнять операцию
второй - GqlGen; это проверяет, может ли он выполнить операцию, если первый не может
Я использую следующий код:
type reqBody struct {
Query string `json:"query"`
}
func Handler(sg *core.SuperGraph, next http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
bodyBytes, _ := ioutil.ReadAll(r.Body)
r.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
var rBody reqBody
err = json.NewDecoder(bytes.NewBuffer(bodyBytes)).Decode(&rBody)
ctx := context.WithValue(r.Context(), core.UserIDKey, "user_id")
res, err := sg.GraphQL(ctx, rBody.Query, nil)
if err == nil {
render.JSON(w, r, res) // go-chi "render" pkg
} else {
next.ServeHTTP(w, r)
}
}
}
func main() {
r := chi.NewRouter()
r.Group(func(r chi.Router) {
r.Post("/graphql", Handler(supergraph, gqlgen))
})
}
ВОПРОСЫ
Могу ли я вообще избежать этих строк?
bodyBytes, _ := ioutil.ReadAll(r.Body) r.Body = ioutil.NopCloser(bytes.NewReader(bodyBytes))
Есть ли лучший способ справиться со всем этим?
Я знаю, что могу использовать шлюз GraphQL для объединения нескольких схем в одной конечной точке, но действительно ли это того стоит? Моя идея / код действительно плохая?