何时使用 `parent` 以及何时使用 `root` 作为 GraphQL-resolver 函数中的第一个参数

Posted

技术标签:

【中文标题】何时使用 `parent` 以及何时使用 `root` 作为 GraphQL-resolver 函数中的第一个参数【英文标题】:When to use `parent` and when to use `root` as first argument in a GraphQL-resolver function 【发布时间】:2019-04-02 18:02:19 【问题描述】:

我已经看到了一些教程和示例,它们有时使用 parent,有时使用 root 作为他们在 graphql 解析器中的第一个参数。

在什么情况下正确的命名是什么?为什么?

例如(nodejs):

signup: (root, args, context, info) => signup(root, args, context, info)

signup: (parent, args, context, info) => signup(parent, args, context, info)

或在注册的函数中:

const signup(root, args, context, info) = 
    // do magic stuff

const signup(parent, args, context, info) = 
    // do magic stuff

【问题讨论】:

这些只是命名约定。这些只是参数名称。你的解析器总是用 4 个参数调用。您可以使用 even (alpha,beta,gamma,zeta) 或其他名称来调用它。 是的,但是有一些我应该遵循的指南,特别是对于 root/parent 吗?我想知道它是否有一些有价值的意图将它命名为这个或那个。 每个解析器调用中的根或有时父参数只是上一次调用的结果(如果没有另外指定,初始值为 null)。 【参考方案1】:

这里没有既定的惯例。我见过rootparentobj 都在不同的参考指南中使用。归根结底,您可以随心所欲地调用函数参数——您的代码将发挥相同的作用。

也就是说,我通常使用该字段的一部分解析的类型的名称。所以对于像

这样的类型
type RoomRental 
  user: User
  date: Date

解析器签名如下所示:

user: (roomRental, args, context, info) => 
  //

我发现,当您(或队友)阅读代码时,这样可以更轻松地推断您的解析器在做什么。同样,这只是我的偏好,但您可能会发现它有助于使您的代码更易于消化。

为了完成,我还要补充一点,GraphQL.js 确实有一个可配置的 root 值。该值作为根级字段解析器中的第一个参数(即,QueryMutation 等类型的字段)传递。通过根目录传递东西并没有太多用处——你可能以这种方式传递的任何东西都应该放在你的context 中。但是,root 值是实现的一部分,这可能是您看到很多示例使用 root 作为第一个参数的名称的原因。

【讨论】:

以上是关于何时使用 `parent` 以及何时使用 `root` 作为 GraphQL-resolver 函数中的第一个参数的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 Storyboard 以及何时使用 XIB

何时使用 GetXXX() 方法以及何时使用 Getter 属性

何时使用 .First 以及何时将 .FirstOrDefault 与 LINQ 一起使用?

Vuex - 何时使用 getter 以及何时使用状态

何时使用 @RunWith 以及何时使用 @ExtendWith

何时使用 viewDidLoad 以及何时使用 awakeFromNib