我使用用rootValue
初始化的express-graphql并将其传递给GraphQL的execute函数。我想知道rootValue
的规范是什么。我看到了一些简单的示例,但是我对完整的规范感兴趣。
最佳答案
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类型。因为它是一个字段,所以可以通过调用与其关联的解析器来解析它。但是因为它是查询的根,所以没有“源”值。这是传递给rootValue
的execute
的唯一目的-它将作为“源”值传递给每个根级别的解析器。换句话说,无论您如何设置
rootValue
,都会将其作为第一个参数传递给Query
,Mutation
和Subscription
类型的每个字段的解析器。由于
rootValue
仅对根级别的解析器可用,因此其使用受到很大限制。应该将所有可用于所有解析程序的数据都包含在上下文中。为了完善起见,我应该注意那里有一些示例,展示了如何使用SDL和
buildSchema
创建模式。因为buildSchema
没有提供为任何字段提供解析器的方法,所以这些示例提供了一种通过rootValue
传递解析器函数来解析根级别字段的方法。之所以有效,是因为如文档所述:[如果没有提供解析器功能,则使用默认的解析器,它在源上查找与该字段同名的方法。如果找到,则使用(参数,上下文,信息)调用该方法。
但是,同样,
rootValue
仅可用于根类型(查询,变异和订阅)上的字段。如果以这种方式创建模式,则将无法为任何其他类型的字段定义解析器。换句话说,不要这样做。有关更多详细信息,请参见this answer。