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

Tidak dapat menyambungkan graphql-ws ke gqlgen

WBOY
Lepaskan: 2024-02-06 09:54:12
ke hadapan
1071 orang telah melayarinya

无法将 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:
Salin selepas log masuk

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)
Salin selepas log masuk

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))
Salin selepas log masuk

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
Salin selepas log masuk

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{}}))
Salin selepas log masuk

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{}}))
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan