繁体   English   中英

将 graphql-ws 客户端与 gqlgen golang 服务器连接时,获取与“ws://localhost:7080/query”的 WebSocket 连接失败

[英]Getting WebSocket connection to 'ws://localhost:7080/query' failed on connecting graphql-ws client with gqlgen golang server

下面列出的订阅查询代码在graphql 游乐场上运行良好,但是当我尝试将我的graphql-ws客户端与 gqlgen 驱动的 go 服务器连接时,我得到了WebSocket 连接到 'ws://localhost:7080/query' 失败错误。 我尝试使用graphql-ws 的 useServer function连接到我在本地运行的其他本地主机服务器,该服务器运行良好但在连接 go 服务器时出现问题。

客户代码:-

(async () => {
 const client = graphqlWs.createClient({
            url: 'ws://localhost:7080/query',
        });


 const onNext = (data) => {
          /* handle incoming values */
          console.log("data===>", data)
  };

    await new Promise((resolve, reject) => {
                unsubscribe = client.subscribe(
                    {
                        query: `subscription {
                            ping
                          }`
                       
                    },
                    {
                        next: onNext,
                        error: reject,
                        complete: resolve
                    },
                );
            });
            } catch(e) {
                console.error("E==>", e)
            }
   })();  

自从过去两天开始苦苦挣扎以获得一些有用的博客和在线链接但没有发现任何有用的连接 go 服务器与 vanilla js 的东西。 还在其 github 页面上搜索了graphql-ws库中列出的问题,但也没有列出此类问题。

如果需要其他信息,请告诉我。

如果您正在谈论这个gqlgen ,它不支持GraphQL 超过 WebSocket 协议graphql-ws实现。 遗憾的是,它仅支持subscriptions-transport-ws的旧协议。 (这就是graphql-playground起作用的原因)。 这意味着,您必须在其后端使用subscriptions-transport-ws

gqlgen的 ws 子协议是graphql-transport-ws ,因为gqlgen@v0.15.0 如果有人仍然面临“helloworld”的连接问题,请检查 websocket 升级程序的checkOrigin属性。

我正在使用gqlgen@v0.17.22并发现Websocket/Subscription的官方示例无法配置checkOrigin属性。 问题是handler.NewDefaultServer已经配置了 ws 传输,我们可以使用handler.New并自己完成 rest 部分。

srv := handler.New(graphql.NewSchema(client))
srv.AddTransport(transport.Options{})
srv.AddTransport(transport.GET{})
srv.AddTransport(transport.POST{})
srv.AddTransport(transport.MultipartForm{})
srv.SetQueryCache(lru.New(1000))
srv.Use(extension.Introspection{})
srv.Use(extension.AutomaticPersistedQuery{
    Cache: lru.New(100),
})
// add ws transport configured by ourselves
srv.AddTransport(&transport.Websocket{
    Upgrader: websocket.Upgrader{
        //ReadBufferSize:  1024,
        //WriteBufferSize: 1024,
        CheckOrigin: func(r *http.Request) bool {
            // add checking origin logic to decide return true or false
            return true
        },
    },
    KeepAlivePingInterval: 10 * time.Second,
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM