2017-07-07 59 views
0

上午好,我目前正在研究GraphQL的REST API之上。假設JSON響應是一個包含id,名稱,電子郵件和「地址」這樣的元素的對象「用戶」,該地址是由街道,套件,城市和郵編組成的對象。我應該如何在這個'地址'字段的模式中聲明類型,其中包含多個元素。我已經看過文檔,並且無法理解我的場景的正確類型。RQL API上的GraphQL

相關的架構的片斷如下:

export default new GraphQLObjectType({ 
    name: 'User', 
    description: 'User(s) object in JSONPlaceholder Fake API', 
    fields:() => ({ 
     id: { 
      type: GraphQLID 
     }, 
     name: { 
      type: GraphQLString 
     }, 
     username: { 
      type: GraphQLString 
     }, 
     email: { 
      type: GraphQLString 
     }, 
     address: { 
      type: (?) 
     } 
    }) 
}) 

下面是我的JSON API,我的目標。

{ 
    "id": 1, 
    "name": "Leanne Graham", 
    "username": "Bret", 
    "email": "[email protected]", 
    "address": { 
    "street": "Kulas Light", 
    "suite": "Apt. 556", 
    "city": "Gwenborough", 
    "zipcode": "92998-3874", 
    "geo": { 
     "lat": "-37.3159", 
     "lng": "81.1496" 
    } 
    }, 
    "phone": "1-770-736-8031 x56442", 
    "website": "hildegard.org", 
    "company": { 
    "name": "Romaguera-Crona", 
    "catchPhrase": "Multi-layered client-server neural-net", 
    "bs": "harness real-time e-markets" 
    } 
} 

我想創建單獨的對象和創建解析器只能獲取特定的「地址」對象,但這意味着我查詢兩次。我想可能有一些解決方法來避免這種情況。

在此先感謝!

回答

0

如上所述,您應該創建一個新的GraphQLObjectType來表示地址對象及其字段,然後將其設置爲地址類型。在這種情況下,由於字段名稱與JSON負載匹配,因此不需要自定義解析器。

如果您認爲您最終可能會對REST API進行重複調用,您可能會發現dataloaders來自Facebook的庫有幫助。您可以使用它來確保每個請求只對REST API發出一個給定的請求。它也可以幫助其他配料等配料。

你的代碼會是這個樣子 -

const AddressType = new GraphQLObjectType({ 
    name: 'AddressType', 
    description: 'Address', 
    fields:() => ({ 
     // then add all the fields on address 
    }) 
}) 

export default new GraphQLObjectType({ 
    name: 'User', 
    description: 'User(s) object in JSONPlaceholder Fake API', 
    fields:() => ({ 
     id: { 
      type: GraphQLID 
     }, 
     name: { 
      type: GraphQLString 
     }, 
     username: { 
      type: GraphQLString 
     }, 
     email: { 
      type: GraphQLString 
     }, 
     address: { 
      type: AddressType 
     } 
    }) 
}) 
+0

謝謝!我想通,實際上包含的對象物體內只可能被宣佈爲你在上述。奇怪的是,緩存機制可以基於在load()方法上傳遞的參數或者在DataLoader對象內的HTTP請求中檢測到類似的請求? 目前我認爲有很多解決方法,比如在load()方法中的大括號內傳遞參數,並在HTTP請求中解壓縮以修改,或者我只是調用一個函數,它接受任何返回僅調用加載的DL對象的參數特定的(和操縱的)參數?你推薦哪種方法? –

+0

如果我們需要傳遞多個參數來加載我們傳遞的對象(使用花括號加載參數),我已經使用了相當數量的加載器和我們的團隊。如果你這樣做,提供一個cacheKeyFn非常重要,因爲它默認使用標識比較而不是值比較。對於鍵以相同順序提供的小對象,它可以像設置'cacheKeyFn:JSON.stringify'一樣簡單 –