Можно ли опускать возвращаемые поля вместо null для полей с нулевым значением в GraphQL?

#graphql #apollo-server

#graphql #apollo-server

Вопрос:

Допустим, у меня есть тип следующим образом:

 type Person {
  id: String!
  name: String!
  email: String
}
  

Поле электронной почты может быть null . Нормально ли при возврате Person из resolver просто не возвращать поле email для объекта Person, например:

 {
  id: '1056'
  name: 'Bob Smith',
}
  

Вместо:

 {
  id: '1056'
  name: 'Bob Smith',
  email: null
}
  

Ответ №1:

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

У каждого поля в вашей схеме есть распознаватель по умолчанию, который запускается, если вы сами не укажете распознаватель (при условии, что распознаватель запускается в первую очередь). В вашем примере, если мы опустим распознаватель для email , распознаватель по умолчанию эффективно выполнит следующее:

  • Найдите свойство, вызываемое email по значению, разрешенному родительскому полю (в данном случае Person объекту)
  • Если свойство найдено, оно преобразуется в значение свойства — если свойство является функцией, оно сначала вызовет функцию и преобразует в возвращаемое значение
  • Если свойство не найдено, оно примет значение null

Другими словами, если свойство с тем же именем, что и у поля, не существует в родительском значении, поле по умолчанию всегда будет принимать значение null. Также стоит отметить, что в GraphQL нет понятия undefined , только null . В GraphQL.js , неопределенные значения всегда принудительно присваиваются null .

Ответ №2:

В GraphQL вы всегда возвращаете то, что запрашивает приложение-потребитель (интерфейс / запрос).

Итак, если кто-то запрашивает пользователя, например:

 query getUser {
  user {
   id
   name
   email
  }
}
  

и если электронное письмо имеет значение null, то вывод будет:

 {
  id: '1056'
  name: 'Bob Smith',
  email: null
}
  

но, если вы измените запрос потребителя, чтобы запрашивать только id и name , то он не вернет электронное письмо.

Вы не можете определить распознаватель, который возвращает только в том случае, если не null.

Комментарии:

1. Да, но должен ли преобразователь возвращать null для поля электронной почты или достаточно пропустить? В моем тестировании, если опущено поле, которое запрашивает клиент и которое можно обнулить, GraphQL возвращает null.

2. @Kainan в вашем распознавателе вы должны каким-то образом возвращать null, если значение email не существует. Но если клиент не запрашивает это, распознаватель электронной почты не запустится.

Ответ №3:

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