[英]Query with Relay and GraphQL
我正在學習React + Relay + GraphQL教程@ https://facebook.github.io/relay/docs/tutorial.html
我對於什么接口感到困惑:[nodeInterface]在GraphQL對象定義中做了什么。
當客戶端(通常是瀏覽器)請求從初始提取已經擁有的一段GraphQL數據時, nodeInterface
僅由GraphQL使用,以便重新獲取。
在以下任何情況下都會執行重新獲取:
this.props.relay.forceFetch()
,這通常發生在程序員認為服務器端的數據可能因其他外部更改時 this.props.relay.setVariable(...)
,這需要更改最初獲取的數據。 在重新獲取期間,GraphQL使用(全局)節點ID調用nodeInterface
, nodeInterface
需要檢索與該節點ID關聯的服務器端對象。 使用該服務器端對象,GraphQL服務器可以返回客戶端所需的附加/變體數據。
因此,如果永遠不重新創建初始對象數據,則永遠不需要節點ID。
有關詳細信息,請參閱: https : //medium.com/@khor/relay-graphql-de-mystifying-node-id-38757121b9c
nodeInterface
節點ID執行到服務器端對象解析,因此它總是看起來像:
var {nodeInterface, nodeField} = nodeDefinitions(
(globalId) => {
var {type, id} = fromGlobalId(globalId);
if (type === 'ClassA') {
// Get ClassA type of instance with id
// E.g.,
return ClassA.find_by_id(id)
} else if (type === 'ClassB') {
return ClassB.find_by_id(id)
}
...
}
)
由於需要重新獲取的GraphQL類型需要Node ID,因此在GraphQL架構中您需要:
globalIdField
關鍵字自動生成節點ID interface : [nodeInterface]
從而:
var ClassAType = new GraphQLObjectType({
name: 'ClassA',
description: 'A',
fields: () => ({
id: globalIdField('ClassA'),
... other fields ...
}),
interfaces: [nodeInterface],
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.