对象识别

FactionShip 都有我们可以用它来重新获取他们的标识符。我们通过 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 参数的 nodeid 对系统中的某些对象进行查询的结果), 并且 base64ing 一个字符串是GraphQL中有用的约定,用于提醒查看者字符串是明文标识符

有关服务器应如何运行的详细信息,请参见 GraphQL Object Identification 规范。