Добавление заголовка CORS в пример gqlgen по умолчанию? - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь настроить базовый c стек, используя React, Apollo, обслуживаемый graphQL и обслуживаемый Go через gqlgen.

Я слежу за началом работы руководство по gqlgen, которое отлично работает.

Я также следую руководству по Getting Started для Apollo, которое прекрасно работает.

Моя проблема заключается в chrome не позволяя мне пинговать бэкэнд, когда я пытаюсь соединить их вместе. Я получаю ошибку заголовка предпечатной проверки CORS, которая понятна, учитывая, что React на localhost:3000 и сервер Go на localhost:8080

gqlgen предоставил полезный пример того, как запустить CORS на Go server здесь с использованием chi и go -cors. Однако приведенный пример основан на примере gqlgen starwars , а не на примере Getting-Start * .

Я изменил пример CORS следующим образом:

package main

import (
    "net/http"

    "github.com/99designs/gqlgen/graphql/handler"
    "github.com/99designs/gqlgen/graphql/handler/transport"
    "github.com/99designs/gqlgen/graphql/playground"
    "github.com/FlockSupport/graphql/graph"
    "github.com/FlockSupport/graphql/graph/generated"
    "github.com/go-chi/chi"
    "github.com/gorilla/websocket"
    "github.com/rs/cors"
)

func main() {
    router := chi.NewRouter()

    // Add CORS middleware around every request
    // See https://github.com/rs/cors for full option listing
    router.Use(cors.New(cors.Options{
        AllowedOrigins:   []string{"http://localhost:8080"},
        AllowCredentials: true,
        Debug:            true,
    }).Handler)

    // srv := handler.New(starwars.NewExecutableSchema(starwars.NewResolver())) // MODIFIED THIS.
    srv := handler.New(generated.NewExecutableSchema(generated.Config{Resolvers: &graph.Resolver{}}))

    srv.AddTransport(&transport.Websocket{
        Upgrader: websocket.Upgrader{
            CheckOrigin: func(r *http.Request) bool {
                // Check against your desired domains here
                return r.Host == "example.org"
            },
            ReadBufferSize:  1024,
            WriteBufferSize: 1024,
        },
    })

    router.Handle("/", playground.Handler("GraphQL Playground", "/query"))
    // router.Handle("/", handler.Playground("Starwars", "/query")) // MODIFIED THIS.
    router.Handle("/query", srv)

    err := http.ListenAndServe(":8080", router)
    if err != nil {
        panic(err)
    }
}

Сервер работает, но тестирование запросов через игровую площадку (localhost: 8080, поэтому CORS здесь не имеет значения) выдает следующую ошибку:

{
  "error": {
    "errors": [
      {
        "message": "transport not supported"
      }
    ],
    "data": null
  }
}

Это также не работает даже если я настраиваю только маршрутизатор Chi:


func main() {
    router := chi.NewRouter()

    srv := handler.New(generated.NewExecutableSchema(generated.Config{Resolvers: &graph.Resolver{}}))

    router.Handle("/", playground.Handler("GraphQL Playground", "/query"))
    router.Handle("/query", srv)

    err := http.ListenAndServe(":8080", router)
    if err != nil {
        panic(err)
    }
}

, когда я получаю локальный хост: 8080 *, я получаю Server Cannot Be Reached.

Как правильно включить CORS на сервере gqlgen Go так Реакт может пинговать это?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

У меня была та же проблема, и я решил ее, используя метод NewDefaultServer вместо New.

srv := handler.NewDefaultServer(.....)
0 голосов
/ 28 марта 2020

Вы должны предоставить проверки CORS в качестве промежуточного программного обеспечения. Например, вы можете использовать «github.com/rs/cors». Это может выглядеть как следующий код

mux.Handle("/playground", handler.Playground("API", "/gql"))
mux.Handle("/gql",
    handler.GraphQL(
        gen.NewExecutableSchema(gen.Config{Resolvers: resolver.New(dep)}),
        handler.ErrorPresenter(errorCustomize)))
h := cors.AllowAll().Handler(util.JwtMiddleware(mux))

srv := &http.Server{
    Addr:    ":8087",
    Handler: h,
}
...