Я пытаюсь настроить базовый 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 так Реакт может пинговать это?