Проблема с subscription при schema stitching в apollo server

151
10 октября 2019, 16:50

Помогите найти ошибку как правильно подключить subscription при schema stitching.

Использую apollo-server-express для graphql back-end. В нём планирую обрабатывать только mutations, а query и subscription перенаправить на hasura с помощью schema stitching c интроспекцией. Query через apollo-server к hasura отрабатывают нормально и возвращают ожидаемые данные.

А вот subscription не работают и я получаю вот такую ошибку: " Expected Iterable, but did not find one for field subscription_root.users"

При чем на сам сервер hasura ивенты приходят:

Но apollo-server возмущается на ответ от hasura. Не первый день мучаюсь и не могу понять в чем проблема.

В самом редакторе hasura подписки работают.

import {
  introspectSchema,
  makeExecutableSchema,
  makeRemoteExecutableSchema,
  mergeSchemas,
  transformSchema,
  FilterRootFields
} from 'graphql-tools';
import { HttpLink } from 'apollo-link-http';
import nodeFetch from 'node-fetch';
import { resolvers } from './resolvers';
import { hasRoleResolver } from './directives';
import { typeDefs } from './types';
import { WebSocketLink } from 'apollo-link-ws';
import { split } from 'apollo-link';
import { getMainDefinition } from 'apollo-utilities';
import { SubscriptionClient } from 'subscriptions-transport-ws';
import * as ws from 'ws';
import { OperationTypeNode } from 'graphql';
interface IDefinitionsParams {
  operation?: OperationTypeNode,
  kind: 'OperationDefinition' | 'FragmentDefinition'
}
const wsurl = 'ws://graphql-engine:8080/v1alpha1/graphql';
const getWsClient = function (wsurl: string) {
  const client = new SubscriptionClient(wsurl, {
    reconnect: true,
    lazy: true
  }, ws);
  return client;
};
const wsLink = new WebSocketLink(getWsClient(wsurl));
const createRemoteSchema = async () => {
  const httpLink = new HttpLink({
    uri: 'http://graphql-engine:8080/v1alpha1/graphql',
    fetch: (nodeFetch as any)
  });
  const link = split(
    ({ query }) => {
      const { kind, operation }: IDefinitionsParams = getMainDefinition(query);
      console.log('kind = ', kind, 'operation = ', operation);
      return kind === 'OperationDefinition' && operation === 'subscription';
    },
    wsLink,
    httpLink,
  );
  const remoteSchema = await introspectSchema(link);
  const remoteExecutableSchema = makeRemoteExecutableSchema({
    link,
    schema: remoteSchema
  });
  const renamedSchema = transformSchema(
    remoteExecutableSchema,
    [
      new FilterRootFields((operation, fieldName) => {
        return (operation === 'Mutation') ? false : true; //  && fieldName === 'password'
      })
    ]
  );
  return renamedSchema;
};
export const createNewSchema = async () => {
  const hasuraExecutableSchema = await createRemoteSchema();
  const apolloSchema = makeExecutableSchema({
    typeDefs,
    resolvers,
    directiveResolvers: {
      hasRole: hasRoleResolver
    }
  });
  return mergeSchemas({
    schemas: [
      hasuraExecutableSchema,
      apolloSchema
    ]
  });
};

Ссылка на код

Если нужны какие-то дополнительные данные - предоставлю.

Answer 1

Исправил установкой graphql-tools 4-й версии. Оказывается редактор даже не заметил что у меня нету этой зависимость и просто брал и node_modules ту версию, которую установил какой-то другой пакет. Проблемная версия 3.x. Pull request где ошибка была исправлена

READ ALSO
Как написать скрипт куков, который будет определять посетил ли юзер страницу?

Как написать скрипт куков, который будет определять посетил ли юзер страницу?

Есть страница, на которой выведены ее дочерние элементы (другие страницы, сайт на modx Revo)Кликаешь в выводе на любую страницу и переходишь на нее

189
Laravel & Webpack plugins

Laravel & Webpack plugins

Хочу использовать плагин webpack в laravel для обфускации JS (https://githubcom/javascript-obfuscator/webpack-obfuscator), но не могу настроить сам webpack

241
Как реализован вход в instagram?

Как реализован вход в instagram?

Заметил интересную вещь при авторизации в instagram, если один раз зашел в инстаграм через веб страницуТо на всех устройствах тебе предлагает...

149
Парсинг цветов Linux консоли в JavaScript

Парсинг цветов Linux консоли в JavaScript

По сети мне прилетают логи с запущенного нативного приложения под линуксЛоги прилетают с цветом, т

176