Не удается получить поля из фрагментов интерфейса - PullRequest
0 голосов
/ 28 августа 2018

У меня проблемы с использованием IntrospectionFragmentMatcher для разрешения интерфейсов. Я выполнил шаги из документации, но не могу запросить поля внутри некоторого фрагмента интерфейса.

Я использую react-apollo s graphql HOC для запроса данных.

Я взял базовые frontpage-server и frontpage-react-app, чтобы иметь минимальный пример.

Схема:

interface Entity {
  id: Int!
}

interface Person {
  firstName: String
  lastName: String
}

type Author implements Entity, Person {
  id: Int!
  firstName: String
  lastName: String
  # ... other fields
}

type Post implements Entity {
  id: Int!
  # ... other fields
}

Resolvers:

const resolveFunctions = {
  Entity: {
    __resolveType: obj => {
      if (obj.author && obj.title) {
        return 'Post';
      }
      // should have more logic
      return 'Author';
    },
  },
  Person: {
    __resolveType: obj => {
      // should have more logic
      return 'Author';
    },
  },
  // ... other resolvers
};

И средство сопоставления фрагментов (обратите внимание, что я использую apollo-client@1.x):

new ApolloClient({
  networkInterface,
  dataIdFromObject: r => r.id,
  fragmentMatcher: new IntrospectionFragmentMatcher({
    introspectionQueryResultData: {
      __schema: {
        types: [
          {
            kind: 'INTERFACE',
            name: 'Entity',
            possibleTypes: [
              { name: 'Author' },
              { name: 'Post' },
            ],
          },
          {
            kind: 'INTERFACE',
            name: 'Person',
            possibleTypes: [
              { name: 'Author' },
            ],
          }
        ],
      },
    }
  }),
});

А затем я модифицирую запрос, чтобы получить поля по фрагменту интерфейса (хотя я знаю, что в этом случае написание запроса, как этот, не имеет никакого смысла). Например:

import { graphql } from 'react-apollo';

graphql(`
  query allPosts {
    posts {
      ... on Entity {
        id
      }
      title
      votes
      author {
        ... on Entity {
          id
        }
        ... on Person {
          firstName
          lastName
        }
      }
    }
  }
`);

Здесь происходят две странные вещи:

  1. поле id правильно извлечено для posts и author, но ни firstName, ни lastName нет (в моем проекте у меня также есть эти несоответствия). HOC не предоставляет данные

  2. для обоих полей, в которых нет данных, я вижу, что данные правильно хранятся в хранилище с избыточностью , и если запуск запроса в GraphiQL работает просто прекрасный

Ребята, вы знаете, что может быть причиной этого? Что-нибудь еще, что я должен сделать для правильного запроса интерфейсов?

Заранее спасибо!

...