GraphQL: массив / список, не допускающий значения NULL

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

type Link {
  id: ID!
  url: String!
  description: String!
  postedBy: User
  votes: [Vote!]!
}

Из-за документов votes: [Vote!]! означает, что это поле не должно допускать значения NULL, и сам массив также не должен допускать значения NULL. Но сразу после этого автор учебника показывает пример запроса и для некоторых ссылок возвращает пустой массив для поля votes. Нравится:

{
 "url": "youtube.com",
 "votes": []
},
{
 "url": "agar.io",
 "votes": []
}

Итак, мой вопрос: не означает ли «не допускающий значения NULL» «пустой» в схеме graphQL или это просто какое-то неправильное поведение сервера graphQL (я имею в виду, что он возвращает массив ничего без предупреждения о том, что должно быть что-то из-за схемы) .

Спасибо!


person DefLee    schedule 16.10.2017    source источник
comment
Могу я узнать URL-адрес учебника, о котором вы говорите?   -  person user3454439    schedule 14.06.2018


Ответы (1)


Ненулевое значение означает именно то, на что оно похоже - не ноль. Пустой массив не является нулевым - он все равно возвращает значение.

Вот сводная таблица:

declaration accepts: | null | []   | [null] | [{foo: 'BAR'}]
------------------------------------------------------------------------
[Vote!]!             | no   | yes  | no     | yes
[Vote]!              | no   | yes  | yes    | yes
[Vote!]              | yes  | yes  | no     | yes
[Vote]               | yes  | yes  | yes    | yes

[Vote!]! означает, что поле (в данном случае votes) не может возвращать null и что оно должно преобразовываться в массив и что ни один из отдельных элементов внутри этого массива не может иметь значение NULL. Таким образом, [], [{}] и [{foo: 'BAR'}] будут действительными (при условии, что foo не равно нулю). Однако следующее вызовет: [{foo: 'BAR'}, null]

[Vote]! означает, что поле не может возвращать значение NULL, но любой отдельный элемент в возвращаемом списке может иметь значение NULL.

[Vote!] означает, что все поле может иметь значение NULL, но если оно действительно возвращает значение, оно должно быть передано в массив, и каждый элемент в этом массиве не может иметь значение NULL.

[Vote] означает, что все поле может быть нулевым, но если оно действительно возвращает значение, оно должно быть в массиве. Однако любой член массива также может иметь значение NULL.

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

Для получения дополнительной информации вы можете прочитать раздел list and non-null в введение в GraphQL или ознакомьтесь со спецификацией .

person Daniel Rearden    schedule 16.10.2017
comment
Может быть, я запутался из-за параграфа в учебнике: [Эпизод]! представляет собой массив объектов Episode. Поскольку он также не допускает значения NULL, вы всегда можете ожидать массив (с нулем или большим количеством элементов) при запросе поля sizesIn. По некоторым причинам я, хотя, если отсутствие восклицательного знака означает ноль или больше элементов поэтому наличие восклицательного знака означает, что должен быть хотя бы 1 элемент. Спасибо за Ваш ответ! - person DefLee; 16.10.2017
comment
@ daniel-Rearden спасибо за точный ответ. Но зачем мне использовать массив с нулями внутри? [] и [null] очень похожи (внутри нет информации), так зачем нам оба? - person Vladimir Alexiev; 18.06.2019
comment
@VladimirAlexiev Может быть полезно для возврата одного элемента массива для каждого запрошенного элемента (пример: запрос [4, 1, 2, 6] = ›ответ [Vote, null, null, Vote]) - person kunnix; 28.08.2019
comment
Я подумал, что есть еще одна причина: сообщить об определенном элементе как об ошибочном. Скажем, «Голосование» имеет обязательное поле, но оно отсутствует, или конкретный голосование: тогда ошибка должна быть распространена, и все голосование должно быть аннулировано. И если массив имеет тип [Голосование!], То весь массив должен быть обнулен! - person Vladimir Alexiev; 02.09.2019
comment
Хороший момент @VladimirAlexiev Ошибки будут распространяться по-разному в зависимости от того, является ли элемент списка ненулевым или нет. См. этот раздел спецификации для подробнее. - person Daniel Rearden; 03.09.2019