Клиент Apollo - WebSocketLink и HttpLink в одном клиенте - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь подключить клиента 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"

Я провел небольшое исследование по этой теме, но не смог найтирешение. По сути, ссылки apollo могут быть как прекращающими, так и не прекращающимися. Не прекращается, так что они могут быть связаны друг с другом. Но они должны заканчиваться завершающей ссылкой, когда отправляет запрос. Я не уверен, насколько это точно, но это мое нынешнее понимание. И, очевидно, HttpLink и WebSocketLink завершаются.

Учитывая то, как запросы и подписки работали с этой конфигурацией, я решил игнорировать ошибку, но теперь я столкнулся с другими проблемами, которые, по моему мнению,быть симптомами этой ошибки. Решающие элементы на сервере становятся неопределенными для объекта запроса.

Мне сказали, что можно настроить клиент на выполнение как HTTP, так и WS. Буду признателен за любые рекомендации по этому вопросу.

Спасибо

...