Как оформить подписку на graphql с помощью Absinthe (Elixir) и Urql?

Моя идея заключалась в том, чтобы создать клиентское приложение с использованием response и urql и graphql api с использованием эликсира и абсента, но на данный момент кажется, что они не очень хорошо сочетаются друг с другом.

Есть ли способ действительно использовать подписку Absinthe с любым другим клиентом, кроме Apollo? Я пытался использовать urql, но у меня не получается соединение с ws, и появляется следующая ошибка:

Соединение WebSocket с 'ws://localhost:4000/socket/websocket' не удалось: ошибка во время рукопожатия WebSocket: отправлен непустой заголовок 'Sec-WebSocket-Protocol', но ответа не было

Единственное, что я нашел до сих пор, что, похоже, связано с этой проблемой, - это библиотека absinthe / socket-apollo-link (https://github.com/absinthe-graphql/absinthe-socket/tree/master/packages/socket-apollo-link), но это явно только для Apollo.

В своей неудачной попытке я сделал следующее:

import React from 'react'
import { Provider, Client, dedupExchange, fetchExchange, subscriptionExchange } from 'urql'
import { cacheExchange } from '@urql/exchange-graphcache'
import { SubscriptionClient } from 'subscriptions-transport-ws'

const DataProvider = ({ children }) => {
  const cache = cacheExchange({})
  const subscriptionClient = new SubscriptionClient('ws://localhost:4000/socket/websocket', {})
  const client = new Client({
    url: 'http://localhost:4000/api',
    exchanges: [
      dedupExchange,
      cache,
      fetchExchange,
      subscriptionExchange({
        forwardSubscription: operations => subscriptionClient.request(operations),
      }),
    ],
  })
  return <Provider value={client}>{children}</Provider>
}

export default DataProvider

Этот 'subscriptions-transport-ws' я нашел из учебника, и этот загадочный '/websocket' в конце URL-адреса ws был упомянут в некоторой проблеме gh, но, похоже, он работает (прежде чем добавить, что в конце URL-адреса было нет соединения ws вообще).

2 ответа

Это не дает прямого ответа на вопрос, но на тот случай, если кто-то окажется в таком же замешательстве и в качестве ответа на ваш комментарий здесь:

Я нашел из учебника, и этот загадочный '/websocket' в конце URL-адреса ws был упомянут в какой-то проблеме с gh, но, похоже, он работает (до добавления этого в конец URL-адреса вообще не было соединения с ws).

Это связано с тем, что как longpoll, так и websocket являются жизнеспособными транспортными средствами. Вероятно, ваш сокет определен в вашем Endpoint с участием websocket: trueкоторый дал вам этот маршрут. Бег mix phx.routes | grep socket была бы полезной командой.

Очевидно, это запоздалый ответ, но я все равно постараюсь. Кажется, у Absinthe есть альтернативная клиентская библиотека, отличная отsubscriptions-transport-ws, в частности, это здесь: https://github.com/absinthe-graphql/absinthe-socket/blob/master/packages/socket-apollo-link/src/createAbsintheSocketLink.js

Если вы вместо этого интегрируетесь с этой библиотекой, вероятно, она будет работать. Это означает, что вам, вероятно, придется интегрироваться сPhoenixSocketвместо этого, как показано здесь: https://github.com/absinthe-graphql/absinthe-socket/tree/master/packages/socket-apollo-link

Другие вопросы по тегам