GraphQL:传递给执行的rootValue规范是什么?

时间:2019-01-22 07:26:29

标签: graphql

我使用express-graphql,它用rootValue初始化并将其传递给GraphQL的execute函数。我想知道rootValue的规范是什么。我看到了一些简单的示例,但我对完整的规范感兴趣。

1 个答案:

答案 0 :(得分:1)

rootValue特定于javascript实现,据我所知,不是官方规范中明确要求的。

这是docs中提供的resolve函数(或解析器)的类型定义:

type GraphQLFieldResolveFn = (
  source?: any,
  args?: {[argName: string]: any},
  context?: any,
  info?: GraphQLResolveInfo
) => any

传递给解析器的第一个参数是“源”,“根”或“父”值。字段始终与某些对象类型相关联。 “源”值只是返回该对象类型的字段解析为的值。例如,给定一个查询,例如:

{
  user(id: 1) {
    location {
      city
    }
  }
}

user字段返回一个对象类型。解析时,解析后的值作为“源”传递到location解析器。同样,location解析时,解析后的值将传递给解析器的所有请求字段,例如city

在我们的示例中,user是字段,就像其他字段一样,它恰好是Query类型,但是该类型本身仍然是Object类型。由于它是一个字段,因此可以通过调用与其关联的解析器来解析。但是,因为它位于查询的 root 中,所以没有“源”值。这是传递给rootValue的{​​{1}}的唯一目的-它作为“源”值传递给每个根级别的解析器。

换句话说,对于executerootValueQuery类型的每个字段,无论您设置了什么Mutation,都将作为第一个参数传递给解析器。 / p>

由于Subscription仅对根级解析器可用,因此其使用非常有限。应该将所有可用于所有解析器的数据包括在上下文中。

为完成起见,我应注意那里有一些示例,展示了如何使用SDL和rootValue创建模式。因为buildSchema没有提供为任何字段提供解析程序的方法,所以这些示例提供了一种通过通过buildSchema传递解析程序功能来解析根级别字段的方法。之所以有效,是因为,如文档所述:

  

[如果未提供解析器功能,则使用默认的解析器,该解析器在源上查找与该字段同名的方法。如果找到,则使用(参数,上下文,信息)调用该方法。

不过,rootValue同样仅可用于根类型(查询,变异和订阅)上的字段。如果以这种方式创建模式,则将无法为任何其他类型的字段定义解析器。换句话说,不要这样做。有关更多详细信息,请参见this answer