2017-10-04 112 views
1

比方說,我graphql服務器要在那裏person3person5一些ID的獲取以下數據作爲JSON:與動態密鑰阿波羅/ GraphQL字段類型爲對象

"persons": { 
    "person3": { 
    "id": "person3", 
    "name": "Mike" 
    }, 
    "person5": { 
    "id": "person5", 
    "name": "Lisa" 
    } 
} 

問題:如何創建模式類型定義與阿波羅?

這裏的密鑰person3person5取決於我的查詢(即在查詢中使用的area)動態生成。所以在另一次我可能會得到person1person2,person3返回。 正如你看到的persons不是Iterable的,所以下面將不作爲graphql類型定義我與阿波羅做工作:

type Person { 
    id: String 
    name: String 
} 
type Query { 
    persons(area: String): [Person] 
} 

persons對象鍵可以永遠是不同的。

當然,一種解決方案是將傳入的JSON數據轉換爲使用persons的數組,但是沒有辦法像這樣使用數據?

+0

你能澄清一下'b'和'g'是什麼意思'動態生成取決於我的查詢嗎?一個或另一個的存在取決於請求中的字段嗎? –

+0

@DanielRearden所以'b'和'g'都是id的。也許我應該在這個問題上更清楚一點。該查詢將包含僅用於獲取人員子集的選項,因此對於一個查詢,響應將包含id爲「a」,「b」,「c」的人員以及用於另一個查詢例如「b」和「g」的人員,如這個問題。 – Andru

+0

@DanielRearden我現在把'b'改成'person3',把'g'改成'person 5',並加入了一些文字和變量以使其更清晰。該查詢將包含選項以僅獲取文本中概述的人員子集。 – Andru

回答

3

GraphQL依賴服務器和客戶端提前知道哪些字段可用於每種類型。在某些情況下,客戶端可以發現這些字段(通過內省),但對於服務器而言,他們總是需要提前知道。所以以某種方式根據返回的數據動態生成這些字段是不可能的。

可以利用定製JSON scalar和返回的查詢:

type Query { 
    persons(area: String): JSON 
} 

通過使用JSON,你繞過需要爲返回的數據,以適應任何特定的結構,這樣你就可以發回什麼只要格式正確的JSON就可以。

當然,這樣做有很大的缺點。例如,你失去了以前使用過的類型所提供的安全網絡(從字面上看,任何結構都可以返回,如果你返回了錯誤的結構,直到客戶端嘗試之後纔會發現它)使用它並失敗)。您也失去了對返回數據中的任何字段使用解析器的能力。

可是......你的葬禮:)

順便說一句,我會考慮將其發送回客戶端之前的數據不上不下到一個數組(就像你在你的問題的建議)。如果您正在編寫客戶端代碼,並使用動態大小的客戶列表,那麼使用數組將更容易處理,而不是通過id鍵入的對象。例如,如果您正在使用React,併爲每個客戶顯示一個組件,那麼您最終會將該對象轉換爲數組映射它。在設計你的API時,我會讓客戶可用性成爲一個更高的考慮因素,而不是避免額外處理你的數據。

+0

感謝您的意見!我轉換來自服務器的傳入數據。僅供參考:使用ID的對象的原因是客戶端更快地檢索,因爲它只是查找某個特定人員的ID。 – Andru

+0

我的情況是通過Rails/GraphQL API返回驗證錯誤。我不知道什麼鍵會有錯誤,因此我使用了一個自定義的JSON標量。 –

+0

其實我改變了我的方法來使用嵌套數組,這讓我一直返回帶有錯誤的字段。 –