У меня проблемы с использованием 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
}
}
}
}
`);
Здесь происходят две странные вещи:
поле id
правильно извлечено для posts
и author
, но ни firstName
, ни lastName
нет (в моем проекте у меня также есть эти несоответствия). HOC не предоставляет данные
для обоих полей, в которых нет данных, я вижу, что данные правильно хранятся в хранилище с избыточностью , и если запуск запроса в GraphiQL работает просто прекрасный
Ребята, вы знаете, что может быть причиной этого? Что-нибудь еще, что я должен сделать для правильного запроса интерфейсов?
Заранее спасибо!