GraphQL突变如何知道它正在修改哪个节点?数据库中的每个节点是否都有唯一的全局节点ID?

时间:2019-02-26 15:42:12

标签: reactjs graphql

我正在通过Robin Wieruch的有用教程(https://www.robinwieruch.de/getting-started-github-graphql-api/

学习GraphQL。

我不清楚的一件事是特定端点的突变如何“知道”它正在修改的对象(查询似乎可以通过从上到下遍历数据库树来进行)。

例如,通过GitHub GraphQL API addReaction突变(https://developer.github.com/v4/mutation/addreaction/),我们有了subjectID,文档称其为“要修改的主题的节点ID”。 。是的,但是大概整个GitHub可能有不止一件事情,您可能想对此做出回应。这是否意味着此subjectID在整个GitHub上是唯一的,以便GraphQL API可以“自动”确切地知道它在GitHub中的所有许多元素中应该添加(例如)“竖起大拇指”的位置?如果不是这种情况,它怎么知道?在这种情况下,这个唯一的全局ID是否永久存在,直到删除该节点为止?

1 个答案:

答案 0 :(得分:1)

GitHub的GraphQL模式为Relay-compliant。在他们的主页上:

  

Relay是一个JavaScript框架,用于构建由GraphQL支持的数据驱动的React应用程序,它从头开始设计,易于使用,可扩展,最重要的是具有高性能。

尽管Relay是前端客户端,但它要求架构包含某些功能,以便客户端按预期工作。这些功能之一是Global Object Identification。如何提供全球唯一的ID由服务器决定。但是,Relay提供了具有内置机制的服务器端帮助程序库:

context

所有这些操作是将id和GraphQL类型组合在一起,然后使用Base64对其进行编码。只要您不从不同的表返回相同类型的行,就可以保证这是唯一的。

这就是GitHub API的工作方式。但是,并非所有的GraphQL API都符合中继标准。以这种方式设计模式既有收益,也有成本。为了更直接地回答您的问题,如何解决字段完全取决于服务器。您为特定字段(包括根级突变)编写的解析器会通过以下两条信息传递:

  • 父字段解析为的值
  • 该字段的参数

大多数实现还提供了某种info对象和一个{{1}}对象,它们描述了GraphQL请求本身,尽管严格来说这并不是规范的一部分。关键是,这就是解析程序真正“意识到”的全部。但是,由于您是编写解析器的人,因此您将根据编写解析器的字段知道需要查询或处理哪些数据。