为了账号安全,请及时绑定邮箱和手机立即绑定

将 CORS 标头添加到 gqlgen 默认示例中?

将 CORS 标头添加到 gqlgen 默认示例中?

Go
交互式爱情 2022-05-23 16:44:45
我正在尝试使用 React 设置一个基本堆栈,Apollo 由 graphQL 提供服务,由 Go 通过 gqlgen 提供服务。我正在遵循 gqlgen 的入门指南,它工作正常。我也在关注 Apollo 的入门指南,它运行良好。我的问题在于当我尝试将两者缝合在一起时,chrome 不允许我 ping 后端。我收到一个 CORS 预检标头错误,这是可以理解的,考虑到 React 已打开localhost:3000且 Go 服务器已打开localhost:8080gqlgen 提供了一个有用的示例,说明如何使用 chi 和 go-cors 在 Go 服务器上运行 CORS。然而,提供的示例基于gqlgen的星球大战示例,而不是入门示例。我将 CORS 示例修改为以下内容:package mainimport (    "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)    }}如何在 gqlgen Go 服务器上正确启用 CORS,以便 React 可以 ping 它?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您需要提供 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,

}


查看完整回答
反对 回复 2022-05-23
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

我有同样的问题,并通过使用NewDefaultServer方法而不是New.

srv := handler.NewDefaultServer(.....)


查看完整回答
反对 回复 2022-05-23
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

我遇到了同样的问题,但实际上是因为当我向服务器发出请求时,我没有添加 header Content-Type: application/json。奇怪的是,我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":[]}}


查看完整回答
反对 回复 2022-05-23
  • 3 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号