2017-04-12 87 views
1

如果這是一個愚蠢的問題,道歉。這是繼電器/ graphql分頁是交代不清我的代碼:我對relay和graphql解析方法感到困惑

const GraphQLTodo = new GraphQLObjectType({ 
    name: 'Todo', 
    fields: { 
    id: globalIdField('Todo'), 
    text: { 
     type: GraphQLString, 
     resolve: (obj) => obj.text, 
    }, 
    complete: { 
     type: GraphQLBoolean, 
     resolve: (obj) => obj.complete, 
    }, 
    }, 
    interfaces: [nodeInterface], 
}); 

/* When pagination is needed, make a connection */ 
const { 
    connectionType: TodosConnection, 
    edgeType: GraphQLTodoEdge, 
} = connectionDefinitions({ 
    name: 'Todo', 
    nodeType: GraphQLTodo, 
}); 

const GraphQLUser = new GraphQLObjectType({ 
    name: 'User', 
    fields: { 
    id: globalIdField('User'), 
    todos: { 
     type: TodosConnection, 
     args: { 
     status: { 
      type: GraphQLString, 
      defaultValue: 'any', 
     }, 
     ...connectionArgs, 
     }, 
     resolve: (obj, {status, ...args}) => 
     connectionFromArray(getTodos(status), args), 
    }, 
    totalCount: { 
     type: GraphQLInt, 
     resolve:() => getTodos().length, 
    }, 
    completedCount: { 
     type: GraphQLInt, 
     resolve:() => getTodos('completed').length, 
    }, 
    }, 
    interfaces: [nodeInterface], 
}); 
const Root = new GraphQLObjectType({ 
    name: 'Root', 
    fields: { 
    viewer: { 
     type: GraphQLUser, 
     resolve:() => getViewer(), 
    }, 
    node: nodeField, 
    }, 
}); 

你可以看到,在GraphQLTodo領域,它的文字和完成字段與決心函數傳遞了一個obj參數,如何OBJ過去了嗎?它來自GraphQLUser的解決方案嗎?我讀過源文檔(在本例中爲obj) - 從父類型字段解析的對象。它不是來自根查詢嗎?如何創建obj?

回答

2

的連接

這裏是(一些),奇蹟發生了:

const { 
    connectionType: TodosConnection, 
    edgeType: GraphQLTodoEdge, 
} = connectionDefinitions({ 
    name: 'Todo', 
    nodeType: GraphQLTodo, 
}); 

你現在告訴GraphQL一個TodosConnection將要由GraphQLTodo節點。現在,讓我們來看看對象是在GraphQLUser對象的連接獲取實際哪裏,這是對todos領域:

todos: { 
    type: TodosConnection, 
    args: { 
    status: { 
     type: GraphQLString, 
     defaultValue: 'any', 
    }, 
    ...connectionArgs, 
    }, 
    resolve: (obj, {status, ...args}) => 
    connectionFromArray(getTodos(status), args), 
}, 

那麼,這是否對象從何而來?這裏的關鍵部分是getTodos函數,它負責實際從數據源獲取對象數組。由於此字段爲TodosConnection,並且我們已經在連接定義中指定了節點爲GraphQLTodo s,因此GraphQL知道textcomplete字段是通過獲取(在本例中)已返回的對象上的同名字段來解決的。換句話說,返回的對象被傳遞給每個字段上的resolve方法。

查詢根

你有兩個領域暴露在Rootviewernode。暫時忽略node,您只有一種方法來實際查詢待辦事項。由於viewerGraphQLUser類型,GraphQLUsertodos領域,它們只能作爲viewer一個子進賬,這樣的:節點

但是,我們認爲node場的

{ 
    viewer { 
    todos(first: 10) { 
     edges { 
     # each node is a Todo item 
     node { 
      text 
      complete 
     } 
     } 
    } 
    } 
} 

之謎?當給定唯一的globalId(其僅僅是類型名稱和id的base64編碼)時,Relay希望能夠使用頂級查詢獲取任何對象,即在Root字段上,所以Todo:1被編碼爲VG9kbzox。這是在nodeDefinitions(你沒有包括在這裏,但可能有)。在這些定義中,globalId被解析回typeTodo)和id1),然後再次告訴它如何從數據源中獲取正確的對象。它看起來是這樣的:因爲你在實現你都和GraphQLTodo類型GraphQLUsernodeInterface

const { nodeInterface, nodeField } = nodeDefinitions(
    (globalId) => { 
    const { type, id } = fromGlobalId(globalId); 
    if (type === 'Todo') { 
     return getTodo(id) 
    } else if (type === 'User') { 
     return getUser(id) 
    } 
... 

,接力將是從Rootnode場其中一方能夠查詢。

+0

非常感謝,我將在我們的社區頁面(臉書)上分享您的答案我希望有一種方法可以與您聯繫@Eric Streeper –