2017-03-03 12 views
3

facebook的relayjs教程,我需要幫助理解教程的這一部分,它指出什麼是relay中的nodeInterface,nodeField和nodeDefinitions?我目前在做

接下來,讓我們定義一個節點接口和類型。我們只需要提供中繼從對象到與該對象關聯 的GraphQL類型映射 方式,從全球的ID所指向的對象

const {nodeInterface, nodeField} = nodeDefinitions(
    (globalId) => { 
    const {type, id} = fromGlobalId(globalId); 
    if (type === 'Game') { 
     return getGame(id); 
    } else if (type === 'HidingSpot') { 
     return getHidingSpot(id); 
    } else { 
     return null; 
    } 
    }, 
    (obj) => { 
    if (obj instanceof Game) { 
     return gameType; 
    } else if (obj instanceof HidingSpot) { 
     return hidingSpotType; 
    } else { 
     return null; 
    } 
    } 
); 

在上nodeDefinition的第一個參數,它從哪裏得到它的'globalId?是Game和HidingSpot GraphQLSchema上的一個名字?這是什麼'const {type,id} = fromGlobalId(globalId);'做?還有第二個參數是什麼?我需要幫助理解nodeDefinitions,不知何故,我無法在官方文檔中找到nodeDefinitions。謝謝。

回答

2

如果你正在寫無中繼一個GraphQL服務器,您可以定義的查詢類型的若干入口點,如:

type Query { 
    picture(id: Int!): Picture 
    user(id: Int!): User 
    ...etc 
} 

所以,當你想獲得一個用戶,你就可以輕鬆搞定它是因爲user可用作圖形的入口點。當你爲你的頁面/屏幕建立一個查詢時,它通常會有幾個級別的深度,你可以去user -> followers -> pictures

有時您希望只能重新檢索部分查詢,也許您正在對連接進行分頁,或者您已經運行了突變。 Relay的Node接口所提供的是一種標準的方式來獲取任何類型的,該類型通過全局唯一的ID實現。中繼能夠在其查詢中識別這些節點,並且如果可能的話將使用它們來進行重新排版和分頁更高效。我們將節點類型添加到根查詢類型:現在

type Query { 
    picture(id: Int!): Picture 
    user(id: Int!): User 
    ...etc 
    node(id: ID!): Node 
} 

nodeDefinitions。基本上這個函數讓我們定義了兩件事:

  1. 如何返回給定其globalId的對象。
  2. 如何返回給定對象的類型。

第一個用於獲取節點字段的ID參數並用它來解析對象。第二種方法允許您的GraphQL服務器計算出返回哪種類型的對象 - 爲了讓我們能夠在查詢節點時定義特定類型的碎片,這是必要的,這樣我們才能真正獲得我們想要的數據。如果沒有這個,我們不能成功地執行這樣的查詢:

query Test { 
    node(id: 'something') { 
    ...fragment on Picture { 
     url 
    } 
    ...fragment on User { 
     username 
    } 
    } 
} 
+0

只是困惑,如何返回給定對象的類型,所以obj這裏來自何時創建? globalId顯然來自id字段。 –

0

中繼使用全局對象標識,這意味着,據我瞭解,如果您的應用程序曾經嘗試搜索一個對象。在你的例子中,嘗試尋找一個遊戲,或嘗試尋找一個隱藏點。中繼將嘗試獲取標準節點接口中的對象。即通過遊戲的{id:123}查找,或者通過{id:abc}查找hidingSpot。如果您的模式(Game,HidingSpot)沒有設置節點接口,Relay將無法獲取對象。

因此,如果您的應用程序需要在「遊戲」中進行搜索,則在架構中,您需要定義節點接口。

通過使用graphql-relay幫助程序,在應用程序中只使用nodeDefinitions函數一次,以基本上將全局定義的ID映射到實際數據對象及其GraphQL類型。

第一個參數接收globalId,我們將globalId映射到其相應的數據對象中。 globalId實際上可以用於使用fromGlobalId函數來讀取對象的類型。

第二個函數接收結果對象,Relay使用它來將對象映射到它的GraphQL數據類型。所以如果對象是Game的一個實例,它將返回gameType等。

希望它能幫助你理解。我也在學習。

相關問題