簡體   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