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

GraphQL:传递给执行的rootValue规范是什么?,graphql,Graphql,我使用expressgraphql,它用rootValue初始化并将其传递给graphql的函数。我想知道什么是rootValue的规范。我看过一些简单的例子,但我对完整的规范感兴趣。根值是特定于javascript实现的,据我所知,不是官方规范明确要求的东西 这是中提供的resolve函数(或解析器)的类型定义: 传递给解析器的第一个参数是“源”、“根”或“父”值。字段始终与某个对象类型关联。“source”值只是返回该对象类型的字段解析为的值。例如,给定如下查询: { user(id:

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

根值是特定于javascript实现的,据我所知,不是官方规范明确要求的东西

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

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

{
  user(id: 1) {
    location {
      city
    }
  }
}
user
字段返回对象类型。解析时,解析后的值作为“源”传递到
位置
解析程序。类似地,当
location
解析时,解析的值将传递给所有请求字段的解析程序,如
city

在我们的示例中,
user
是字段,与其他字段一样,它恰好位于
Query
类型上,但该类型本身仍然是对象类型。因为它是一个字段,所以可以通过调用与其关联的解析程序来解析它。但是因为它位于查询的根,所以没有“源”值。这是传递给
execute
rootValue
的唯一用途——它作为“源”值传递给每个根级别的解析器

换句话说,对于
查询
变异
订阅
类型的每个字段,您设置的
根值
都将作为第一个参数传递给解析器

由于
rootValue
仅适用于根级别的解析器,因此它的使用非常有限。所有解析程序都可以使用的任何数据都应该包含在上下文中

为了完整起见,我应该注意到,有一些示例展示了如何使用SDL和
buildSchema
创建模式。由于
buildSchema
不提供为任何字段提供解析程序的方法,因此这些示例提供了通过
rootValue
传入解析程序函数来解析根级别字段的方法。这是因为,正如文档所述:

[如果]未提供冲突解决程序函数,则使用默认的冲突解决程序,在与字段同名的源上查找方法。如果找到,则使用(args、context、info)调用该方法

但是,
rootValue
仅对根类型(查询、变异和订阅)上的字段可用。如果以这种方式创建架构,则无法为任何其他类型的字段定义解析程序。换句话说,不要这样做。有关更多详细信息,请参阅

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