Как работать с нулями в схеме GraphQL

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

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

type FlightSchedule {
    airline: Airline!
    operatingAirline: Airline
}

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

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

person Raj Chaudhary    schedule 10.11.2018    source источник


Ответы (1)


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

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

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

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

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

person Daniel Rearden    schedule 10.11.2018