Типы перечислений GraphQL автоматически разрешают свои значения? - PullRequest
0 голосов
/ 25 января 2019

Стоит ли ожидать, что типы перечислений будут разрешаться автоматически или типы существуют только для ограничения параметров?

Имеются следующие схемы GraphQL:

type Job {
  description: String!
  status: Status!
}

enum Status {
  PENDING_REVIEW
  PENDING_APPROVAL
  APPROVED
}

и запрос, который выглядит так:

query job {
  description
  status
}

Если моя база данных вернула следующее:

{ "description": "Some irrelevant job description", "status": 1 }

Я ожидаю, что GraphQL вернется:

{ "description": "Some irrelevant job description", "status": "PENDING_APPROVAL" }

Неправильно ли я что-то настроил или это ожидаемое поведение, которое потребует от меня написания решателя для status

const getQuestionStatus = ({ status }) => ['PENDING_REVIEW', 'PENDING_APPROVAL', 'APPROVED'][status];

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Это зависит от языка, на котором вы реализуете GraphQL. Типами перечислений в GraphQL являются просто типов перечислений и ничего более. Это означает, например, что ваш тип перечисления APPROVED ничего не оценивает. Это дает разработчику больше возможностей делать с ними то, что они хотят. Если вы хотите, чтобы enum отображался в целые числа, вам нужен преобразователь, как вы описали.

Из статьи GraphQL о схемах и типах:

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

0 голосов
/ 26 января 2019

В GraphQL.js с каждым значением перечисления в типе перечисления может быть связано значение. Установка этого значения не является обязательной; по умолчанию используется строковое представление имени значения. То есть для перечисления вроде:

enum ExampleEnum {
  FOO
  BAR
}

по умолчанию, значение для FOO будет "FOO". Если вы используете graphql-tools для построения своей схемы (или apollo-server, который использует graphql-tools под капотом`), мы можем передать значения для типа Enum прямо в наших преобразователях:

const resolvers = {
  Query: {
    example: () => 11, // field with ExampleEnum type
  },
  ExampleEnum: {
    FOO: 11,
    BAR: 23,
  },
}

Как только мы это сделаем, мы можем вернуть определенное значение в наш преобразователь, и оно будет сериализовано в соответствующее значение Enum. Примечание: то же самое верно для перечислений, которые используются в качестве аргументов - если в качестве аргумента передано FOO, преобразователь фактически получит значение 11.

Отсутствие значений эквивалентно действию:

ExampleEnum: {
  FOO: 'FOO',
  BAR: 'BAR',
}

Также стоит отметить, что предоставление значений не влияет на то, как значения перечисления отображаются в ответе. Когда результат выполнения сериализуется в JSON, значения перечисления всегда отображаются в виде строковых значений, которые соответствуют именам значений перечисления (то есть "FOO" и "BAR" в нашем примере).

А как насчет ванильного GraphQL.js?

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

const ExampleEnumType = new GraphQLEnumType({
  name: 'ExampleEnum',
  values: {
    FOO: {
      value: 11,
    },
    BAR: {
      value: 23,
    },
  },
})
0 голосов
/ 25 января 2019

Я думаю, вам нужно реализовать для него распознаватель.

Однако, если вы используете Apollo Server, у него есть функция, называемая Внутренние значения , где вы можете использовать 1 в качестве внутреннего значения в преобразователе, Apollo Server автоматически сопоставит его с PENDING_APPROVAL при возврате ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...