Можно ли вернуть поля в GraphQL по условию?

Можно ли с GraphQL вернуть некоторые поля в соответствии с условием? Например:

[{
    name: "Foo",
    age: 38
}, 
{
    name: "Bar",
    age: 50
}]

Я хочу всегда возвращать name, но age, только если имя - Foo. Результат будет примерно таким:

[{
    name: "Foo",
    age: 38
}, 
{
    name: "Bar"
}]

GraphQL поддерживает необязательные и обязательные поля, не могли бы вы объяснить, что вы имеете в виду?

Mosius 22.08.2018 16:19

Я хочу получить данные для некоторых полей, используя условие, например: query {users {name age @include (if: ...)}} Я хочу вернуть возраст поля, только если имя - «Foo». Результат должен быть таким: [{name: "Foo", age: 38}, {name: "Bar"}]

Andrey 22.08.2018 18:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
2
416
1

Ответы 1

В определении типа вы можете установить обязательные и необязательные свойства типа. Например, ваш тип может быть определен как:

type Person {
  name: String!
  age: Int
}

У вас было бы расширение запроса, определяющее что-то вроде этих строк:

extend type Query {
  getPeople: [Person]
}

Там, где у вас была бы логика для возврата различных частей этого, будет ваш код преобразователя. Это может быть что-то вроде этого:

getPeople(obj, input, context) {
  // Make a request for the information from db or wherever it is stored
  // The sql or api request can do the filtering, if not it can be done after it's saved
  const people = context.Users.get.People();
  // Map over fields for expected return per user based on logic
  const filteredPeople = people.map(person => {
    if (person.name === "Foo") {
      return { name: person.name, age: person.age }
    } else {
      return { name: person.name };
    }
  });
  return filteredPeople;
};

Короче говоря, резолверы - это то, что позволяет вам изменять возвращаемую информацию.

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