2017-10-16 158 views
1

我正在學習GraphQL,並在通讀教程時遇到了我無法理解的行爲。 比方說,我們在架構中定義的類型:GraphQL:非空數組/列表

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

由於文檔votes: [Vote!]!意味着該領域應該是一個非空的和陣列本身應該是非空了。但在教程的作者之後,顯示了查詢的示例,並且對於某些鏈接,它將返回votes字段的空數組。就像這樣:

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

所以我的問題是:是否不是「不可爲空」是指graphQL模式「空」或者它只是某種graphQL服務器的錯誤行爲(我的意思是它返回的什麼陣不警告應該有一些由於架構造成的)。

謝謝!

回答

3

非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非空)。但是,下面的投:[{foo: 'BAR'}, null]

[Vote]!表示該字段不能返回null,但在返回列表中的任何單個項目可以爲空。

[Vote!]意味着整個字段可以空的,但如果它返回一個值,它需要一個陣列和陣列中的每個項目不能爲空。

[Vote]意味着整個字段可以爲爲空,但如果它確實返回一個值,則它需要一個數組。但是,該數組的任何成員也可能爲空。

如果您需要驗證數組是否爲空,則必須在解析器邏輯中執行此操作。如果你希望GraphQL在數組爲空時仍然拋出,只需讓你的解析器返回一個被拒絕的Promise。

欲瞭解更多信息,您可以閱讀GraphQL入門的list and non-null章節。

+0

也許我因爲教程中的段落而感到困惑: _「[Episode]!表示一個Episode對象的數組,因爲它也是不可空的,所以當你有一個數組查詢出現在字段中。「_ 由於某些原因,如果缺少感嘆號意味着_」零個或多個項目「_因此感嘆號的存在意味着至少應該有一個項目。感謝您的回答! – DefLee