經常需要詢問 GraphQL 架構,以取得它支援哪些查詢的資訊。GraphQL 允許我們使用內省系統來執行此動作!
對於我們的 Star Wars 範例,檔案 starWarsIntrospection-test.ts 包含多個查詢,用來展示內省系統,且為可執行以演練參考實作的內省系統的測試檔案。
我們設計了類型系統,因此我們知道有哪些類型可用,但如果我們不知道,我們可以透過查詢 Query 根類型上永遠可用的 __schema
欄位來詢問 GraphQL。現在讓我們這麼做,並詢問有哪些類型可用。
哇,那有很多類型!它們是什麼?讓我們將它們分組
現在,讓我們嘗試找出一個好的起點來探索有哪些查詢可用。當我們設計類型系統時,我們指定了所有查詢將從哪種類型開始;讓我們詢問內省系統關於這一點!
這與我們在類型系統區段中所說的相符,即 Query
類型就是我們將開始的地方!請注意,這裡的命名只是依慣例;我們可以將 Query
類型命名為其他任何名稱,如果我們指定它是查詢的開始類型,它仍然會在這裡回傳。不過,將其命名為 Query
是一個有用的慣例。
檢視一個特定類型通常很有用。我們來看一下 Droid
類型
如果我們想要進一步了解 Droid 呢?例如,它是一個介面還是物件?
kind
會回傳一個 __TypeKind
列舉,其中一個值是 OBJECT
。如果我們詢問 Character
,我們會發現它是一個介面
對於物件來說,知道有哪些欄位可用很有用,所以我們來詢問內省系統關於 Droid
的資訊
這些欄位就是我們在 Droid
上定義的欄位!
id
在這裡看起來有點奇怪,它沒有類型的名稱。這是因為它是一種 NON_NULL
的「包裝器」類型。如果我們查詢該欄位類型的 ofType
,我們會在那裡找到 ID
類型,告訴我們這是一個非空的 ID。
類似地,friends
和 appearsIn
都沒有名稱,因為它們是 LIST
包裝器類型。我們可以查詢這些類型的 ofType
,這將告訴我們這些清單的內容。
最後,我們來介紹內省系統的一個功能,它對工具特別有用;我們來詢問系統文件!
因此,我們可以使用內省來存取類型系統的文件,並建立文件瀏覽器或豐富的 IDE 體驗。
這只是自省系統的皮毛;我們可以查詢枚舉值、類型實作的介面,以及更多。我們甚至可以自省自省系統本身。規範在「自省」區段中更詳細地說明這個主題,而 GraphQL.js 中的 introspection 檔案包含實作符合規範的 GraphQL 查詢自省系統的程式碼。