Apollo客户端-同一客户端中的WebSocketLink和HttpLink

时间:2019-10-19 19:20:13

标签: javascript apollo-client

我正在尝试连接apollo客户端,以便它能够处理标准的http请求以及订阅的websocket请求。这是我的客户端配置...

import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { HttpLink } from 'apollo-link-http';
import { onError } from 'apollo-link-error';
import { ApolloLink } from 'apollo-link';
import { WebSocketLink } from 'apollo-link-ws';
import { SubscriptionClient } from 'subscriptions-transport-ws';

const prod = process.env.NODE_ENV === 'production';

const subscriptionClient = new SubscriptionClient(
  `ws${prod ? 's' : ''}://${
    prod ? '**********.herokuapp.com' : 'localhost'
  }:${prod ? '80' : '5000'}/subscription`,
  {
    reconnect: true,
    lazy: true,
  },
);
subscriptionClient.maxConnectTimeGenerator.setMin(10000);

const client = new ApolloClient({
  link: ApolloLink.from([
    onError(({ graphQLErrors, networkError }) => {
      if (graphQLErrors)
        graphQLErrors.forEach(({ message, locations, path }) =>
          console.log(
            `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
          ),
        );
      if (networkError) console.log(`[Network error]: ${networkError}`);
    }),
    new WebSocketLink(subscriptionClient),
    new HttpLink({
      uri: `http${prod ? 's' : ''}://${
        prod ? '**********.herokuapp.com' : 'localhost'
      }:${prod ? '80' : '5000'}/graph`,
      credentials: 'same-origin',
    }),
  ]),
  cache: new InMemoryCache(),
});

export default client;

有趣的是,此客户端实际上可以正常工作。它允许我通过http发出查询请求,并通过ws设置订阅。尽管在页面加载时会引发错误,但这一切都是如此。

Error: "You are calling concat on a terminating link, which will have no effect"

我已经对该主题进行了一些研究,但未能找到解决方案。本质上,阿波罗链接可以是终止的也可以是非终止的。不终止,以便可以将它们链接在一起。但是当发送请求时,它们需要以终止链接结尾。我不确定这有多精确,但这是我目前的理解。显然,HttpLink和WebSocketLink都将终止。

由于查询和订阅在此配置下的工作方式相同,因此我决定忽略该错误,但是现在我遇到了其他一些我认为是该错误症状的问题。对于请求对象,服务器上的解析器变得不确定。

有人告诉我可以配置客户端同时执行HTTP和WS。任何对此问题的指导将不胜感激。

谢谢

0 个答案:

没有答案