首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将CORS头添加到gqlgen默认示例中?

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

Stack Overflow用户
提问于 2020-03-28 11:39:35
回答 3查看 3.2K关注 0票数 4

我正在尝试使用React建立一个基本的堆栈,由graphQL服务的阿波罗通过gqlgen提供服务。

我正在遵循gqlgen的开始指南,它工作得很好。

我也在遵循阿波罗的开始指南,它工作得很好。

我的麻烦在于铬,不允许我平后端时,我试图将两者缝合在一起。我得到一个CORS飞行前报头错误,这是可以理解的,考虑到React是在localhost:3000上,Go服务器在localhost:8080上。

gqlgen提供了一个有用的示例,说明如何使用chi和go-cors在Go服务器这里上运行CORS。然而,所提供的示例是基于gqlgen的星战示例,而不是示例。

我将CORS示例修改如下:

代码语言:javascript
运行
复制
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在这里不重要)提供了以下错误:

代码语言:javascript
运行
复制
{
  "error": {
    "errors": [
      {
        "message": "transport not supported"
      }
    ],
    "data": null
  }
}

即使我只设置了Chi路由器,这也不起作用:

代码语言:javascript
运行
复制
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,从而响应可以对其进行平分?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-03 13:59:42

我也遇到了同样的问题,并通过使用NewDefaultServer方法而不是New来解决它。

代码语言:javascript
运行
复制
srv := handler.NewDefaultServer(.....)
票数 3
EN

Stack Overflow用户

发布于 2020-03-28 13:20:47

您需要提供CORS检查作为中间件。例如,您可以使用"github.com/rs/cors“。它可能看起来像下面的代码

代码语言:javascript
运行
复制
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,
}
票数 3
EN

Stack Overflow用户

发布于 2020-08-18 20:44:20

我也有同样的问题,但实际上是因为,当我向服务器发出请求时,我没有添加头Content-Type: application/json。奇怪的是,我在使用postman时必须包括Content-Length头。

所以,当我尝试:

代码语言:javascript
运行
复制
    curl --request POST \
    --url http://localhost:8000/ \
    --data '{"query":"query {\n  televisions {\n    id\n  }\n}"}'

这就是回应:

代码语言:javascript
运行
复制
{"errors":[{"message":"transport not supported"}],"data":null}

但是当我添加标题时:

代码语言:javascript
运行
复制
    curl --request POST \
    --url http://localhost:8000/ \
    --header 'content-type: application/json' \
    --data '{"query":"query {\n  televisions {\n    id\n  }\n}"}'

服务器响应通常:

代码语言:javascript
运行
复制
{"data":{"televisions":[]}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60900651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档