2017-10-16 7 views
1

私はGraphQLを今学んでおり、チュートリアルを歩いているうちに理解できない動作に遭遇しました。 のは、我々はスキーマでタイプを定義したとしましょう:votes: [Vote!]!は、そのフィールドが非NULL可能でなければならず、配列自体があまりにも非NULL可能でなければならないことを意味しGraphQL:nullableでない配列/リスト

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

ドキュメントに起因します。しかし、チュートリアルの著者の直後にはクエリの例が表示され、リンクの中にはvotesフィールドの空の配列が返されます。このように:

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

だから私の質問は:「null非許容」(私はそれがなくて何の配列を返す意味graphQLスキーマに「空」を意味するかはgraphQLサーバの間違った行動のほんの一部のようなものだしませんスキーマによるものがあるはずであることを警告する)。

ありがとうございます!

答えて

3

null以外は、正確には何も聞こえません - nullではありません。空の配列はnullではなく、まだ値を返しています。ここで

は、集計表である:

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がnullではないと仮定します)。ただし、以下のだろうスロー:[{foo: 'BAR'}, null]

[Vote]!は、フィールドがnullを返すことができないことを意味しますが、返されたリスト内の任意の個々のアイテムはnullにすることができます。

[Vote!]は、フィールド全体 nullにすることができ、それは値を返さない場合は、それが配列する必要があり、そのアレイ内の各項目がヌルでないことを意味します。

[Vote]は、フィールド全体がになることを意味します。はnullになりますが、値を返す場合は配列にする必要があります。ただし、配列のメンバーはnullでもかまいません。

アレイが空であるかどうかを確認する必要がある場合は、リゾルバロジック内で行う必要があります。配列が空のときにGraphQLをスローしたい場合は、リゾルバに拒否されたPromiseを返すようにしてください。

詳細については、GraphQLの紹介のlist and non-nullの章を参照してください。

+0

私はチュートリアルの段落のために混乱しているかもしれません: _ "[Episode]!はエピソードオブジェクトの配列を表します。出現欄に質問してください。 "_ 感嘆符がない場合は、"ゼロ個以上の項目 "を意味する_理由があるため、感嘆符があると少なくとも1つの項目があるはずです。ご回答有難うございます! – DefLee

関連する問題