Как оформить подписку на 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