我是一个websockets新手。我使用urql
和graphql-ws
(从subscriptions-transport-ws
移植而来)来获取graphql订阅。代码如下:
export const useUrqlClient = () => {
const headers = useHeaders();
const client = useMemo(() => createUrqlClient(headers), [headers]);
return client;
};
const createUrqlClient = (headers: any = defaultHeaders) => {
return createClient({
url: GRAPHQL_ENDPOINT,
fetchOptions: {
headers
},
exchanges: [
...defaultExchanges,
subscriptionExchange({
forwardSubscription: (operation) => {
return {
subscribe: (sink) => ({
unsubscribe: wsClient(headers).subscribe(operation, sink)
})
}
}
})
]
});
};
const wsClient = (headers: any) => createWSClient({
url: WS_GRAPHQL_ENDPOINT,
connectionParams: () => ({
headers
})
});
const useHeaders = () => {
const [authHeader, setAuthHeader] = useState<object>({});
const { selectedToken } = useAuth();
useEffect(() => {
if (selectedToken) {
setAuthHeader(selectedToken ? { authorization: `Bearer ${selectedToken}` } : {});
}
}, [selectedToken]);
return {
...defaultHeaders,
...authHeader
};
};
一切正常,但是否可以为每个订阅打开单独的WebSocket连接?x1c 0d1x
它们在离开页面时关闭,并创建另一个,但这是预期的吗?
注意:使用subscriptions-transport-ws的方法也有相同的行为。
1条答案
按热度按时间3zwjbxry1#
您正在
lazy
模式下运行客户端,该模式按需建立WebSocket连接,这是默认设置。请考虑以下两个选项之一:
1.在
lazy = false
模式下使用客户端,该模式将在创建时与服务器建立连接并使其保持活动状态1.使用客户端的
lazyCloseTimeout
选项,在有新订阅的情况下,该选项将延迟关闭连接。