Я использую react-apollo в своем ответном заявителе и не могу понять, как реализовать схему на стороне клиента.
У меня есть определение типа ниже:
export const alertTypeDefs = gql`
type Query {
alert: Alert
}
type Alert {
message: String!
type: String!
duration: Int!
}
`;
Он определяет Query, который возвращает объект alert.
Ниже приведен код, который я хочу использовать для этого запроса.
const cache = new InMemoryCache();
export const createClient = () => {
return new ApolloClient({
cache,
typeDefs: [alertTypeDefs]
});
};
Сначала я инициализировал экземпляр ApolloClient с кешем памяти и alertTypeDefs, определенными выше. Затем ниже приведен код для запуска запроса:
const client = createClient();
const data = client.readQuery({query: gql`
{
alert @client
}
`});
console.info('data:', data);
Но я получил эту ошибку Missing selection set for object of type Alert returned for query field alert при запуске readQuery на экземпляре клиента. Кажется, что Alert не определено. Но я уже определил запрос Alert в typeDefs. Он отлично работает, если я изменю код запроса ниже, в котором я должен указать, что должно быть возвращено внутри { message }. Но, похоже, он не использует схему. Я ожидаю, что мне не нужно указывать поля возврата, если он возвращает все поля в объекте схемы. Я неправильно понимаю схему?
const data = client.readQuery({query: gql`
{
alert @client {
message
}
}
`});
console.info('data:', data);
Если мне нужно указать возвращаемые поля одно за другим, какой смысл определять схему?


Это ожидаемое поведение с GraphQL. Вам всегда нужно указывать внутри запроса, какие поля вы ожидаете. Итак, чтобы получить все данные, вы добавляете в запрос поля:
const data = client.readQuery({query: gql`
{
alert @client {
message
type
duration
}
}
`});
console.info('data:', data);
В спецификациях GraphQL есть открытый вопрос.
К сожалению нет. Проверьте проблему для получения дополнительной информации
Вы можете определить fragment со всеми полями объекта, а затем повторно использовать его.
Так
fragment AllAlertFields on Alert {
message
type
duration
}
А потом в запросе
query {
allAlerts {
...AllAlertFields
}
}
Подробнее: https://www.apollographql.com/docs/react/data/fragments/
Есть ли ярлык для выбора всех полей для объекта? Если мне нужен этот запрос во многих местах, я не хочу указывать их по одному.