Rumah >pembangunan bahagian belakang >Golang >Tidak dapat menyambungkan graphql-ws ke gqlgen

Tidak dapat menyambungkan graphql-ws ke gqlgen

WBOY
WBOYke hadapan
2024-02-06 09:54:121072semak imbas

无法将 graphql-ws 连接到 gqlgen

Kandungan soalan

Saya menggunakan gqlgen sebagai perkhidmatan saya dengan klien apollo dan graphql-ws sebagai bahagian hadapan saya dan saya cuba menggunakan langganan dan ia berfungsi dengan sempurna di taman permainan saya tetapi apabila saya cuba Apabila menyambungkan klien kepadanya , saya mendapat ralat ini:

websocket connection to 'ws://localhost:8080/' failed:

Dalam log bekas saya, saya menerima:

unable to upgrade *http.response to websocket websocket: request origin not allowed by upgrader.checkorigin:
http: superfluous response.writeheader call from github.com/99designs/gqlgen/graphql/handler/transport.senderror (error.go:15)

Ini kod golang saya:

if err := godotenv.load(); err != nil {
    log.fatal("error loading environment variables file")
}

port := helpers.env("port")
if port == "" {
    port = defaultport
}

router := chi.newrouter()

router.use(cors.new(cors.options{
    allowedorigins:   strings.split(helpers.env("allowed_origins"), ","),
    allowcredentials: true,
    debug:            helpers.env("debug") == "true",
    allowedheaders:   []string{"*"},
}).handler)

srv := handler.newdefaultserver(generated.newexecutableschema(generated.config{resolvers: &resolvers.resolver{}}))


srv.addtransport(transport.post{})
upgrader := &transport.websocket{
    upgrader: websocket.upgrader{
        handshaketimeout: 1 * time.minute,
        checkorigin: func(r *http.request) bool {
            return true
        },
        readbuffersize:  1024,
        writebuffersize: 1024,
    },
    keepalivepinginterval: 10 * time.second,
}

srv.addtransport(upgrader)
srv.use(extension.introspection{})
if helpers.env("mode") == "production" {
    cache, err := apq.newcache(24 * time.hour)

    if err != nil {
        log.fatalf("cannot create apq redis cache: %v", err)
    }

    srv.use(extension.automaticpersistedquery{cache: cache})
}


go initworkers()

go runasynqmon()
router.use(getheadersmiddleware())

router.handle("/", srv)

if helpers.env("mode") == "development" {
    router.handle("/playground", playground.handler("graphql playground", "/"))
    log.printf("connect to http://localhost:%s/playground for graphql playground", port)
}

log.fatal(http.listenandserve(":"+port, router))

Ini kod pelanggan saya:

import { setContext } from '@apollo/client/link/context'
import { onError } from '@apollo/client/link/error'
import { GraphQLWsLink } from '@apollo/client/link/subscriptions'
import { getMainDefinition } from '@apollo/client/utilities'
import { createUploadLink } from 'apollo-upload-client'
import { createClient } from 'graphql-ws'

import { logout } from '../helpers/logout'
import { getTokenFromStorage } from '../helpers/userData'
import { lang } from '../localization'

const authLink = setContext((_, { headers }) => {
  const token = getTokenFromStorage()
  return {
    headers: {
      authorization: token ? `Bearer ${token}` : undefined,
      'Accept-Language': lang,
      ...headers
    }
  }
})
const httpLink = createUploadLink({
  uri: process.env.REACT_APP_GRAPH_BFF || 'http://localhost:8080'
})

const wsLink = new GraphQLWsLink(
  createClient({
    url: 'ws://localhost:8080/'
  })
)

const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query)
    return (
      definition.kind === 'OperationDefinition' &&
      definition.operation === 'subscription'
    )
  },
  wsLink,
  httpLink
)

const logoutLink = onError(({ response }) => {
  if (
    response?.errors &&
    response.errors.length > 0 &&
    response.errors.some((errorItem) =>
      errorItem.message.toLowerCase().includes('unauthenticated')
    )
  ) {
    logout()
  }
})

const chainList = [logoutLink, authLink, splitLink]

const linkChain = from(chainList)

const apolloClient = new ApolloClient({
  cache: new InMemoryCache({
    addTypename: false
  }),
  link: linkChain
})

export default apolloClient

Saya fikir menaik taraf checkorigin dalam program akan menyelesaikan masalah, tetapi ia tidak berfungsi Sebarang idea bagaimana untuk menyelesaikan masalah ini?


Jawapan Betul


Ini soalan yang bagus. Maksudnya anda seorang pengaturcara yang berbakat... Balas di bawah:

Anda perlu menukar baris ini:

srv := handler.newdefaultserver(generated.newexecutableschema(generated.config{resolvers: &resolvers.resolver{}}))

Oleh kerana newdefaultserver menggunakan sumber yang sama, yang bermaksud sumber dan hos anda mestilah sama, yang bermaksud kod anda: checkorigin: func(r *http.request) bool { Kembali benar }, Tidak bekerja. Anda perlu menukar newdefaultserver kepada baharu supaya kod anda berubah kepadanya:

srv := handler.New(generated.NewExecutableSchema(generated.Config{Resolvers: &resolvers.Resolver{}}))

Dan soket web anda berfungsi dengan baik. Berhati-hati dengan perubahan ini kerana newdefaultserver mempunyai beberapa konfigurasi di dalamnya untuk mengemas kini atau mendapatkan atau beberapa perkara lain. (lihat pembungkusan itu sendiri) Dan anda perlu menulisnya dengan mudah dalam kod anda.

Atas ialah kandungan terperinci Tidak dapat menyambungkan graphql-ws ke gqlgen. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam