Использование двух обработчиков для проекта GraphQL; обрабатывать запрос вторым, если первый не может

Я пытаюсь использовать как SuperGraph как библиотеку, так и GqlGen.

Итак, у меня есть два обработчика:

  1. первый - SuperGraph; это проверяет, может ли он выполнять операцию

  2. второй - 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))
    })
}

ВОПРОСЫ

  1. Могу ли я вообще избежать этих строк?

      bodyBytes, _ := ioutil.ReadAll(r.Body)
      r.Body = ioutil.NopCloser(bytes.NewReader(bodyBytes))
    
  2. Есть ли лучший способ справиться со всем этим?

  3. Я знаю, что могу использовать шлюз GraphQL для объединения нескольких схем в одной конечной точке, но действительно ли это того стоит? Моя идея / код действительно плохая?

0 ответов

Другие вопросы по тегам