graphql - GraphQL:传递执行的根值规范是什么?
问题描述
我使用 express-graphql 初始化,rootValue
并将其传递给 GraphQL 的执行函数。我想知道什么是rootValue
规范。我看过一些简单的例子,但我对完整的规范感兴趣。
解决方案
这rootValue
是特定于 javascript 实现的,据我所知,不是官方规范明确要求的。
这是文档resolve
中提供的函数(或解析器)的类型定义:
type GraphQLFieldResolveFn = (
source?: any,
args?: {[argName: string]: any},
context?: any,
info?: GraphQLResolveInfo
) => any
传递给解析器的第一个参数是“源”、“根”或“父”值。一个字段总是与一些对象类型相关联。“源”值只是返回该对象类型的字段解析为的值。例如,给定如下查询:
{
user(id: 1) {
location {
city
}
}
}
该user
字段返回一个对象类型。当它解析时,解析的值location
作为“源”传递给解析器。类似地,当location
解析时,解析的值将传递给解析器的所有请求字段,例如city
.
在我们的示例中,user
is 字段和其他字段一样,只是恰好在Query
类型上,但该类型本身仍然是 Object 类型。因为它是一个字段,所以它是通过调用与其关联的解析器来解析的。但是因为它位于查询的根目录,所以没有“源”值。这是rootValue
您传递给的唯一目的execute
——它作为“源”值传递给每个根级解析器。
换句话说,您设置的任何内容rootValue
都将作为第一个参数传递给Query
,Mutation
和Subscription
类型的每个字段的解析器。
由于rootValue
它仅适用于根级解析器,因此它的使用非常有限。应该将所有解析器可用的任何数据都包含在上下文中。
为了完整起见,我应该注意到那里有一些示例展示了如何使用 SDL 和buildSchema
. 因为buildSchema
不提供为任何字段提供解析器的方法,所以这些示例提供了一种方法来解析根级字段,方法是通过rootValue
. 这是有效的,因为正如文档所指出的:
[如果] 未提供解析器函数,则使用默认解析器,它在与字段同名的源上查找方法。如果找到,则使用 (args, context, info) 调用该方法。
但是,同样,rootValue
它仅适用于根类型(查询、变异和订阅)上的字段。如果您以这种方式创建模式,您将无法为任何其他类型的字段定义解析器。换句话说,不要这样做。有关更多详细信息,请参阅此答案。
推荐阅读
- r - 如何根据 R 中的条件获取日期的频率计数?
- java - 为什么我的字符串没有在 AsyncTask 中填充?
- apache - 当我在 docker-machine 中运行容器时,绑定挂载不起作用
- javascript - CSS边框时间动画
- laravel - 从 Laravel 5.8 的数据库中加载部分视图中的数据,并将该视图包含在主布局中
- python - 从可迭代打印可变长度的未打包项目
- ios - 反应原生地图标注按下未在 IOS 上触发
- linux - 尝试调试简单的 nasm 汇编程序时如何修复“sigsegv”
- python - 创建一个主列相互堆叠的数据框
- python-3.x - 在python中创建具有不同索引的列表