Faction
和Ship
都有我们可以用它来重新获取他们的标识符。我们通过 Node
接口和 node
根查询类型的字段将此函数公开给 Relay。
Node
接口包含一个单一的字段id
, 它是一个 ID!
.
node
根字段接收一个参数,一个 ID!
, 并返回一个 Node
。
这两个东西一起来完成成重新获取;如果我们把那个字段回传的 id
传进 node
字段,我们可以把对象取回来。
让我们来在看看这个实例,并查询rebels的 ID:
query RebelsQuery { rebels { id name } }
返回
{ "rebels": { "id": "RmFjdGlvbjox", "name": "Alliance to Restore the Republic" } }
因此在我们系统中现在我们知道这些 Rebel 的 ID 了。我们现在可以重新抓取它们:
query RebelsRefetchQuery { node(id: "RmFjdGlvbjox") { id ... on Faction { name } } }
返回
{ "node": { "id": "RmFjdGlvbjox", "name": "Alliance to Restore the Republic" } }
如果我们对 Empire 做一样的事,我们会发现它回传一个不同的 ID,而我们同样可以重新抓取它::
query EmpireQuery { empire { id name } }
yields
{ "empire": { "id": "RmFjdGlvbjoy", "name": "Galactic Empire" } }
和
query EmpireRefetchQuery { node(id: "RmFjdGlvbjoy") { id ... on Faction { name } } }
yields
{ "node": { "id": "RmFjdGlvbjoy", "name": "Galactic Empire" } }
Node
接口和 node
字段假定为全局唯一的ID进行重新获取。 没有全局唯一ID的系统通常可以通过将类型与类型特定的ID相结合来完成,这是本例中所做的。
我们得到的ID是base64字符串。ID被设计为不透明(唯一应该传递给 id
参数的 node
是
id
对系统中的某些对象进行查询的结果), 并且 base64ing 一个字符串是GraphQL中有用的约定,用于提醒查看者字符串是明文标识符
有关服务器应如何运行的详细信息,请参见 GraphQL Object Identification 规范。