我正在尝试使用React建立一个基本的堆栈,由graphQL服务的阿波罗通过gqlgen提供服务。
我正在遵循gqlgen的开始指南,它工作得很好。
我也在遵循阿波罗的开始指南,它工作得很好。
我的麻烦在于铬,不允许我平后端时,我试图将两者缝合在一起。我得到一个CORS飞行前报头错误,这是可以理解的,考虑到React是在localhost:3000
上,Go服务器在localhost:8080
上。
gqlgen提供了一个有用的示例,说明如何使用chi和go-cors在Go服务器这里上运行CORS。然而,所提供的示例是基于gqlgen的星战示例,而不是示例。
我将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
。
如何在gqlgen Go服务器上正确启用CORS,从而响应可以对其进行平分?
发布于 2020-04-03 13:59:42
我也遇到了同样的问题,并通过使用NewDefaultServer
方法而不是New
来解决它。
srv := handler.NewDefaultServer(.....)
发布于 2020-03-28 13:20:47
您需要提供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,
}
发布于 2020-08-18 20:44:20
我也有同样的问题,但实际上是因为,当我向服务器发出请求时,我没有添加头Content-Type: application/json
。奇怪的是,我在使用postman时必须包括Content-Length
头。
所以,当我尝试:
curl --request POST \
--url http://localhost:8000/ \
--data '{"query":"query {\n televisions {\n id\n }\n}"}'
这就是回应:
{"errors":[{"message":"transport not supported"}],"data":null}
但是当我添加标题时:
curl --request POST \
--url http://localhost:8000/ \
--header 'content-type: application/json' \
--data '{"query":"query {\n televisions {\n id\n }\n}"}'
服务器响应通常:
{"data":{"televisions":[]}}
https://stackoverflow.com/questions/60900651
复制相似问题