私は今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サーバーのある種の誤った動作です(つまり、スキーマによるものがあるはずであるという警告なしに何もない配列を返します) 。
ありがとう!
非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!]
は、フィールド全体canがnullであることを意味しますが、値を返す場合は配列にする必要があり、その配列内の各項目はヌル。
[Vote]
は、フィールド全体canをnullにすることができますが、値を返す場合は配列にする必要があることを意味します。ただし、配列のメンバーもnullになる可能性があります。
配列が空かどうかを確認する必要がある場合は、リゾルバーロジック内で行う必要があります。配列が空の場合でもGraphQLをスローする場合は、リゾルバーに拒否されたPromiseを返させるだけです。
詳細については、GraphQLの概要の list and non-null セクションを読むか、または spec を参照してください。