В GraphQL как «агрегировать» свойства - PullRequest
0 голосов
/ 02 октября 2018

Извините за расплывчатый код, я не могу скопировать / вставить.:)

У меня есть тип в GraphQL, подобный этому:

type Thing {
    toBe: Boolean
    orNot: Boolean
}

Я пытаюсь создать новое свойство для этого типа, которое является ... совокупностью этих двух.В основном возвращает новое значение на основе этих значений.Код будет выглядеть так:

if (this.toBe && !this.orNot) { return "To be!"; }
if (!this.toBe && !this.orNot) { return "OrNot!"; }

Имеет ли это смысл?Так что будет возвращено что-то вроде:

Thing1 {
    toBe: true;
    orNot: false;
    newProp: "To be!"
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Да, вы можете легко создавать агрегированные поля в вашем графике Object types, обрабатывая необходимую логику в этом агрегированном поле resolver.При создании типов объектов у вас есть экземпляр этого объекта, и, следовательно, вы можете легко создать агрегированные поля , которые отсутствуют в моделях вашего домена с использованием данных объекта, и это один изкрасота графика .Обратите внимание, что это может отличаться в каждой реализации библиотек GraphQL.Ниже приведен пример такого варианта использования в JavaScript и Scala.

Пример в Graphql.js:

var FooType = new GraphQLObjectType({
  name: 'Foo',
  fields: {
    toBe: { type: GraphQLBoolean},
    orNot: { type: GraphQLBoolean},
    newProp: { type: GraphQLString,
    resolve(obj) {
        if (obj.toBe && !obj.orNot) { return "To be!"; }
        else { return "OrNot!"; }
    }
  }
});

Пример в Sangria-graphql:

ObjectType(
    "Foo",
    "graphql object type for foo",
    fields[Unit, Foo](
      Field("toBe",BooleanType,resolve = _.value.name),
      Field("orNot",BooleanType,resolve = _.value.path),
      Field("newProp",StringType,resolve = c => {
          if (c.value.toBe && !c.value.orNot) "To be!" else "OrNot!"
      })
    )
  )
0 голосов
/ 03 октября 2018

В различных реализациях серверной библиотеки GraphQL есть способы предоставить функции распознавателя , которые могут предоставить значение для поля.Вы должны будете включить его в свою схему и написать для него код, но это разумно, и код, который вы цитируете, является хорошей отправной точкой.

В частности, в Apollo вы передать карту преобразователей , которые передаются в качестве опции resolvers: конструктору ApolloServer.Если у поля нет распознавателя, по умолчанию будет возвращено соответствующее поле из собственного объекта JavaScript.Таким образом, вы можете написать

const resolvers = {
  Thing: {
    newProp: (parent) => {
      if (parent.toBe && !parent.orNot) { return "To be!"; }
      if (!parent.toBe && !parent.orNot) { return "OrNot!"; }
      return "That is the question";
    }
  }
};
...