如何使用苦艾酒(Elixir)和Urql进行graphql订阅



我的想法是使用react和urql构建一个客户端应用程序,并使用elixir和苦艾酒构建一个graphqlapi,但目前看来它们在一起并没有那么好。

有没有一种方法可以真正与阿波罗以外的任何其他客户一起使用苦艾酒订阅?我曾尝试使用urql,但由于ws连接失败,导致以下错误:

到"ws://localhost:4000/socket/WebSocket"的WebSocket连接失败:WebSocket握手期间出错:发送的不是空的"Sec WebSocket Protocol"标头,但未收到任何响应

到目前为止,我唯一发现的似乎与这个问题有关的是这个库苦艾酒/插座apollo链接(https://github.com/absinthe-graphql/absinthe-socket/tree/master/packages/socket-apollo-link)但这显然只适用于阿波罗。

在我失败的尝试中,我做了以下操作:

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

我在一个教程中发现了这个"订阅传输ws",在一些gh问题中提到了ws url末尾神秘的"/websocket",但它似乎有效(在将其添加到url末尾之前,根本没有ws连接(。

这并不能直接回答问题,但如果有人最终出现同样的困惑,作为对您评论的回应:

我在一个教程中发现,在一些gh问题中提到了ws url末尾的神秘"/websocket",但它似乎有效(在将其添加到url末尾之前,根本没有ws连接(。

这是因为longpoll和websocket都是可行的传输方式。您可能已经在Endpointwebsocket: true中定义了套接字,从而为您提供了该路由。运行mix phx.routes | grep socket将是一个有用的命令。

这显然是一个迟到的回复,但我无论如何都会尽力。似乎苦艾酒有一个不同于subscriptions-transport-ws的替代客户端库,值得注意的是它在这里:https://github.com/absinthe-graphql/absinthe-socket/blob/master/packages/socket-apollo-link/src/createAbsintheSocketLink.js#L8

如果您转而与此库集成,则可能会起作用。因此,这意味着您可能需要与PhoenixSocket集成,如下所示:https://github.com/absinthe-graphql/absinthe-socket/tree/master/packages/socket-apollo-link#examples

最新更新