将 CORS header 添加到 gqlgen 默认示例中?
Adding CORS header into gqlgen default example?
我正在尝试使用 React 设置一个基本堆栈,Apollo 由 graphQL 提供服务,由 Go 通过 gqlgen 提供服务。
我正在遵循 gqlgen 的 getting started 指南,它运行良好。
我也在遵循 Apollo 的 getting started 指南,效果很好。
我的问题在于 chrome 不允许我在尝试将两者拼接在一起时对后端执行 ping 操作。我得到一个 CORS 预检 header 错误,这是可以理解的,考虑到 React 在 localhost:3000
并且 Go 服务器在 localhost:8080
gqlgen 提供了一个有用的示例,说明如何使用 chi 和 go-cors 在 Go 服务器 here 上获取 CORS 运行。但是,提供的示例基于 gqlgen 的 starwars 示例,而不是 getting-started 示例。
我将 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)
}
}
服务器运行,但通过 playground 测试查询(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)
}
}
当我访问 localhost:8080 游乐场时,我得到一个 Server Cannot Be Reached
。
如何在 gqlgen Go 服务器上正确启用 CORS,以便 React 可以 ping 通它?
您需要提供 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,
}
我遇到了同样的问题,并使用 NewDefaultServer
方法而不是 New
解决了它。
srv := handler.NewDefaultServer(.....)
我遇到了同样的问题,但实际上是因为,当我向服务器发出请求时,我没有添加 header Content-Type: application/json
。奇怪的是,我不得不在使用邮递员时包括 Content-Length
header。
所以,当我尝试时:
curl --request POST \
--url http://localhost:8000/ \
--data '{"query":"query {\n televisions {\n id\n }\n}"}'
这是回复:
{"errors":[{"message":"transport not supported"}],"data":null}
但是当我添加 header 时:
curl --request POST \
--url http://localhost:8000/ \
--header 'content-type: application/json' \
--data '{"query":"query {\n televisions {\n id\n }\n}"}'
服务器正常响应:
{"data":{"televisions":[]}}
我正在尝试使用 React 设置一个基本堆栈,Apollo 由 graphQL 提供服务,由 Go 通过 gqlgen 提供服务。
我正在遵循 gqlgen 的 getting started 指南,它运行良好。
我也在遵循 Apollo 的 getting started 指南,效果很好。
我的问题在于 chrome 不允许我在尝试将两者拼接在一起时对后端执行 ping 操作。我得到一个 CORS 预检 header 错误,这是可以理解的,考虑到 React 在 localhost:3000
并且 Go 服务器在 localhost:8080
gqlgen 提供了一个有用的示例,说明如何使用 chi 和 go-cors 在 Go 服务器 here 上获取 CORS 运行。但是,提供的示例基于 gqlgen 的 starwars 示例,而不是 getting-started 示例。
我将 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)
}
}
服务器运行,但通过 playground 测试查询(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)
}
}
当我访问 localhost:8080 游乐场时,我得到一个 Server Cannot Be Reached
。
如何在 gqlgen Go 服务器上正确启用 CORS,以便 React 可以 ping 通它?
您需要提供 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,
}
我遇到了同样的问题,并使用 NewDefaultServer
方法而不是 New
解决了它。
srv := handler.NewDefaultServer(.....)
我遇到了同样的问题,但实际上是因为,当我向服务器发出请求时,我没有添加 header Content-Type: application/json
。奇怪的是,我不得不在使用邮递员时包括 Content-Length
header。
所以,当我尝试时:
curl --request POST \
--url http://localhost:8000/ \
--data '{"query":"query {\n televisions {\n id\n }\n}"}'
这是回复:
{"errors":[{"message":"transport not supported"}],"data":null}
但是当我添加 header 时:
curl --request POST \
--url http://localhost:8000/ \
--header 'content-type: application/json' \
--data '{"query":"query {\n televisions {\n id\n }\n}"}'
服务器正常响应:
{"data":{"televisions":[]}}