#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
значением. Не существует допустимого формата ответа, в котором поле с нулевым значением, выбранное набором выбора операции, разрешено опускать.