Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GraphQL: Non-nullable array/list

I'm learning GraphQL now and while walking through tutorial I met behavior that I can't understand. Let's say we have defined type in schema:

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

Due to docs votes: [Vote!]! means that that field should be a non-nullable and array itself should be non-nullable too. But just after that author of tutorial shows example of query and for some of links it returns empty array for votes field. Like this:

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

So my question is: Doesn't "non-nullable" means "empty" in graphQL schema or it's just some kind of wrong behavior of graphQL server (I mean it returns array of nothing without warning that there should be something due to schema).

Thanks!

like image 422
DefLee Avatar asked Oct 16 '17 12:10

DefLee


People also ask

What is __ Typename in GraphQL?

The __typename field returns the object type's name as a String (e.g., Book or Author ). GraphQL clients use an object's __typename for many purposes, such as to determine which type was returned by a field that can return multiple types (i.e., a union or interface).

IS NOT null GraphQL?

However, the GraphQL type system allows you to make any type non-null which means that the type will never produce a null value. When using a non-null type there will always be a value. A GraphQL non-null field is a GraphQL field where the type is non-null.


1 Answers

Non-null means exactly what it sounds like -- not null. An empty array is not null -- it's still returning a value.

Here is a summary table:

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!]! means that the field (in this case votes) cannot return null and that it must resolve to an array and that none of the individuals items inside that array can be null. So [] and [{}] and [{foo: 'BAR'}] would all be valid (assuming foo is non-null). However, the following would throw: [{foo: 'BAR'}, null]

[Vote]! means that the field cannot return null, but any individual item in the returned list can be null.

[Vote!] means that the entire field can be null, but if it does return a value, it needs to an array and each item in that array cannot be null.

[Vote] means that the entire field can be null, but if it does return a value, it needs to an array. However, any member of the array may also be null.

If you need to verify whether an array is empty, you have to do so within your resolver logic. If you want GraphQL to still throw when an array is empty, just have your resolver return a rejected Promise.

For more information your can read the list and non-null section of the GraphQL introduction or take a look at the spec.

like image 190
Daniel Rearden Avatar answered Oct 03 '22 03:10

Daniel Rearden