如何决定用于 GraphQL 突变的根值

Posted

技术标签:

【中文标题】如何决定用于 GraphQL 突变的根值【英文标题】:How to decide what root value to use for GraphQL mutations 【发布时间】:2016-08-15 06:51:42 【问题描述】:

我正在试验 GraphQL,需要帮助了解如何知道要在即将执行突变时提供什么根值。

具体示例:您要更新当前登录用户的用户名。突变看起来像这样:

 mutation TestMutation 
       updateMyUsername(newName: "CoolName") 
                       username 

此处提供的根对象是当前用户。但是当你收到突变而不解析它并看到它的名字时,你怎么知道呢?由于只有一个端点存在,因此不可能基于 URL 做出决定。并且仅解析字符串以将其进一步发送到将再次解析的地方听起来充其量是浪费。

是否通常的做法是在 URL 或请求正文中提供一些额外的参数来为应用程序提供更多上下文?

【问题讨论】:

【参考方案1】:

在 URL 中包含更多数据并不常见,但由于每个突变都由函数支持,因此您无需解析其名称,只需在函数中定义即可。

由于突变始终是***的,因此它们的根对象将始终是***根对象。如果您需要访问其他对象,则需要确保您提供了足够的信息来检索它

要跟踪当前登录的用户,请查看context,这是运行 GraphQL 查询的初始参数之一,并在每个解析函数中提供。上下文经常用于跟踪登录用户。

现在您已经有了定义“changeMyUsername”的函数、已登录的用户以及提供的带有新用户名的参数,您应该拥有实现该函数主体所需的一切。

【讨论】:

Since mutations are always top level... 实际上突变并不总是必须是***的。 MutationQuery 完全相同,并且可以嵌套解析器。 @zoran404 我认为 Lee 知道他在说什么,因为他是 GraphQL 的规范负责人 :) 根据定义,突变是突变根对象的字段,因此它们总是 ***。然后,您可以从结果中嵌套 selections,但变异字段本身始终是***的。 @kaqqao Mutations 的工作方式与Queries 完全相同。这意味着您可以拥有仅处理对user table 的更改的type UserMutation。这只需要一个***突变字段,其返回类型为UserMutation 并返回一个空对象。【参考方案2】:

我正在试验 GraphQL,需要帮助了解如何知道要在即将执行突变时提供什么根值。

如果您不知道要转发什么作为 root 变量,那么您可能不需要任何内容​​,您可以转发 nullundefined

具体例子:... 此处提供的根对象是当前用户。

您应该将用户作为context 变量而不是root 变量传递。 执行查询时可能会采用相同的方式。

但是当你收到突变而不解析它并看到它的名字时,你怎么知道呢?

您应该为context 对象中的每个请求转发用户对象。 或者如果必须从数据库中加载用户数据,则转发一个用于加载用户的函数。

【讨论】:

以上是关于如何决定用于 GraphQL 突变的根值的主要内容,如果未能解决你的问题,请参考以下文章

如何将单个枚举用于 django 模型和 graphql 突变参数?

graphQl突变查询不适用于变量

Graphql 突变查询不适用于 express-graphql

用户注册的 GraphQL 突变不适用于 jwt

用于在突变字段上映射数组的 GraphQL 语法

当用户连续执行多个graphql突变时防止竞争条件