Как определить схему на стороне клиента в приложении `react-apollo`?

Я использую 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
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
207
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это ожидаемое поведение с GraphQL. Вам всегда нужно указывать внутри запроса, какие поля вы ожидаете. Итак, чтобы получить все данные, вы добавляете в запрос поля:

const data = client.readQuery({query: gql`
  { 
    alert @client {
      message
      type
      duration
    }
  }
`});
console.info('data:', data);

В спецификациях GraphQL есть открытый вопрос.

Есть ли ярлык для выбора всех полей для объекта? Если мне нужен этот запрос во многих местах, я не хочу указывать их по одному.

Joey Yi Zhao 25.06.2019 06:22

К сожалению нет. Проверьте проблему для получения дополнительной информации

jkettmann 25.06.2019 17:57

Вы можете определить fragment со всеми полями объекта, а затем повторно использовать его. Так

fragment AllAlertFields on Alert {
  message
  type
  duration
}

А потом в запросе

query {
  allAlerts {
    ...AllAlertFields
  }  
}

Подробнее: https://www.apollographql.com/docs/react/data/fragments/

Другие вопросы по теме