Как бороться с нулями в схеме GraphQL - PullRequest
0 голосов
/ 10 ноября 2018

Я получаю сообщение «Невозможно вернуть ноль для поля, не обнуляемого» Airline.id. » ошибка, когда FlightSchedule.operatingAirline имеет значение NULL (полностью соответствует схеме) и клиентские запросы для FlightSchedule.operatingAirline.id. Как это исправить? Создание Airline.id, Airline.code и Airline.name как nullable исправляет это, но не является правильным способом решения этой проблемы, потому что, если Airline существует, эти 3 поля также всегда будут существовать. Ниже моя схема:

type Airline {
    id: String!,
    code: String!,
    name: String!
}

type FlightSchedule {
    airline: Airline!
    operatingAirline: Airline
}

И ниже мой запрос:

  getFlightSchedules {
    airline
    {
      id
      code
      name
    }
    operatingAirline
    {
      id
      code
      name
    }
  }

1 Ответ

0 голосов
/ 10 ноября 2018

Поле будет иметь нулевое значение при обнаружении ошибки при ее устранении. Это включает в себя ошибки валидации, подобные той, с которой вы столкнулись. Из спецификации:

Если во время ExecuteSelectionSet () поле с ненулевым fieldType выдает ошибку поля, то эта ошибка должна распространяться на весь этот набор выборок, либо разрешаться на ноль, если это разрешено, либо распространяться далее на родительское поле.

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

Другими словами, если родительское поле относится к определенному типу объекта, и этот тип имеет необнуляемое поле, и это поле разрешается равным нулю, это родительское поле также разрешит к нулю. Родительское поле не может вернуть недопустимый объект (в данном случае, поскольку у него было ненулевое поле, возвращающее ноль), поэтому единственное, что он может сделать, это вернуть ноль. Конечно, если родительское поле не является нулевым, это поведение распространяется вверх по дереву, пока наконец не будет найдено пустое поле.

Итак, почему вы получаете эту ошибку? Потому что ваш распознаватель для operatingAirline является , а не , возвращая ноль. Он возвращает какой-то объект (либо неполный объект авиакомпании, массив, строку или что-то еще), который GraphQL затем эффективно пытается привести к типу Airline. Поле id было запрошено, но оно принимает значение null в зависимости от объекта, возвращенного распознавателем operatingAirline. Так как id был запрошен и возвращен нуль, все поле operatingAirline не проходит проверку и возвращает ноль.

...