Как сделать так, чтобы GraphQL enum разрешал строки - PullRequest
1 голос
/ 12 марта 2019

Ранее я просто набрал input KeyInput как mode: String!, и я хочу изменить тип с String!к пользовательскому перечислению.

У меня есть испробованная следующая схема:

enum Mode= {
    test
    live
}

input KeyInput = {
    mode: Mode!
}

type Key {
    name,
    mode
}

type Query {
    Keys(input: KeyInput): [Key]
}

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

query{
     Keys(input: {mode: "test"}){
        name
     }
}

Однако я получаю следующую ошибку:

      "message": "Expected type Mode!, found \"test\"; Did you mean the enum value test?"

Возможно ли, чтобы значения перечисления разрешали строковые значения?Если я удалю кавычки из ввода, это будет работать.Тем не менее, мне нужно иметь возможность продолжать разрешать режим в виде строк.

1 Ответ

1 голос
/ 12 марта 2019

Из спецификации :

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

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

Другими словами, при использовании перечисления в качестве ввода, если вы используете его в качестве литерального значения, например:

Keys(input: { mode: test }) {
  name
}

значение перечисления (в данном случае test) не может быть заключено в кавычки, в отличие от строковых литералов, которые должны быть заключены в двойные кавычки.

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

Keys(input: { mode: $mode }) {
  name
}

// in your component...
variables: {
  mode: 'test'
}

Поскольку JSON не включает концепцию значений перечисления, всякий раз, когда мы имеем дело с контекстом JSON (например, при объявлении переменных или при возврате data для нашего запроса), значения перечисления просто сериализуются как строковые значения .

Все это, кроме того, если вы используете Apollo в качестве клиента, нужно ли включать кавычки или нет, не имеет значения - если вам нужно подставить значение в поле ввода mode, вам следует используя для этого переменные, в этом случае (как показано выше) вы бы передавали строковое значение независимо от этого.

...