GraphQL LogoGraphQL

內省

經常需要詢問 GraphQL 架構,以取得它支援哪些查詢的資訊。GraphQL 允許我們使用內省系統來執行此動作

對於我們的 Star Wars 範例,檔案 starWarsIntrospection-test.ts 包含多個查詢,用來展示內省系統,且為可執行以演練參考實作的內省系統的測試檔案。

我們設計了類型系統,因此我們知道有哪些類型可用,但如果我們不知道,我們可以透過查詢 Query 根類型上永遠可用的 __schema 欄位來詢問 GraphQL。現在讓我們這麼做,並詢問有哪些類型可用。

哇,那有很多類型!它們是什麼?讓我們將它們分組

  • Query、Character、Human、Episode、Droid - 這些是我們在類型系統中定義的。
  • 字串、布林 - 這些是類型系統提供的內建純量。
  • __Schema、__Type、__TypeKind、__Field、__InputValue、__EnumValue、__Directive - 這些都以雙底線開頭,表示它們是內省系統的一部分。

現在,讓我們嘗試找出一個好的起點來探索有哪些查詢可用。當我們設計類型系統時,我們指定了所有查詢將從哪種類型開始;讓我們詢問內省系統關於這一點

這與我們在類型系統區段中所說的相符,即 Query 類型就是我們將開始的地方!請注意,這裡的命名只是依慣例;我們可以將 Query 類型命名為其他任何名稱,如果我們指定它是查詢的開始類型,它仍然會在這裡回傳。不過,將其命名為 Query 是一個有用的慣例。

檢視一個特定類型通常很有用。我們來看一下 Droid 類型

如果我們想要進一步了解 Droid 呢?例如,它是一個介面還是物件?

kind 會回傳一個 __TypeKind 列舉,其中一個值是 OBJECT。如果我們詢問 Character,我們會發現它是一個介面

對於物件來說,知道有哪些欄位可用很有用,所以我們來詢問內省系統關於 Droid 的資訊

這些欄位就是我們在 Droid 上定義的欄位!

id 在這裡看起來有點奇怪,它沒有類型的名稱。這是因為它是一種 NON_NULL 的「包裝器」類型。如果我們查詢該欄位類型的 ofType,我們會在那裡找到 ID 類型,告訴我們這是一個非空的 ID。

類似地,friendsappearsIn 都沒有名稱,因為它們是 LIST 包裝器類型。我們可以查詢這些類型的 ofType,這將告訴我們這些清單的內容。

最後,我們來介紹內省系統的一個功能,它對工具特別有用;我們來詢問系統文件

因此,我們可以使用內省來存取類型系統的文件,並建立文件瀏覽器或豐富的 IDE 體驗。

這只是自省系統的皮毛;我們可以查詢枚舉值、類型實作的介面,以及更多。我們甚至可以自省自省系統本身。規範在「自省」區段中更詳細地說明這個主題,而 GraphQL.js 中的 introspection 檔案包含實作符合規範的 GraphQL 查詢自省系統的程式碼。

繼續閱讀 →GraphQL 最佳實務