我们 的RESTDataSource
已经 可以 使用 了,但 我们 还没有 任何 解析器 来 使用 它!
一个 解析器 的 任务 是 为 你 的 架构 中 的 一个 字段 填充 数据。 你 的 任务 是 实现 这些 解析器!
究竟 什么 是 一个 解析器?解析器 是 一个 函数。它 的 名字 与 它 为 之 填充 数据 的 字段 相同。它 可以 从 任何 数据 源 获取 数据,然后 将 这些 数据 转换为 客户端 所需 的 形状。
在 server/src/
中,我们 将 从 创建 一个 resolvers.js
文件 开始。
在 这个 文件 中,我们 将 声明 一个 resolvers
常量,暂时 为 它 分配 一个 空 对象。让我们 导出 它,因为 我们 需要 它 在 服务器 配置 选项 中。
const resolvers = {};module.exports = resolvers;
export const resolvers = {};
我们 的 resolvers
对象 的 键 将 与 我们 的 架构 的 类型 和 字段 相对应。
要 为 字段 tracksForHome
创建 一个 解析器,我们 将 首先 在 我们 的 resolvers
对象 中 添加 一个 Query
键。该 键 的 值 将 是 另一个 包含 tracksForHome
键 的 对象。
这个 tracksForHome
键 是 我们 将 定义 与 相应 字段 相对应 的 解析器 函数 的 地方。
趁 我们 在 这里,让我们 在 解析器 上方 添加 一条 注释,以 阐明 它 的 作用。
在 resolvers
对象 中
Query: {// returns an array of Tracks that will be used to populate// the homepage grid of our web clienttracksForHome: () => {},}
我们 的 解析器 将 如何 与 我们 的 数据 源 相互 作用?这 就是 contextValue
发挥 作用 的 地方。 解析器 函数 具有 特定 的 签名,其中 包含 四 个 可选 参数: parent
、args
、contextValue
和 info
。
tracksForHome: (parent, args, contextValue, info) => {},
让我们 简要 地 了解 一下 每个 参数 的 作用
- 父级
parent
是 该 字段 父级 的 解析器 的 返回 值。这 在 处理 解析器 链 时 会 很有用。 - 参数
args
是 一个 对象,其中 包含 所有 由 GraphQL 操作 为 该 字段 提供 的 所有 GraphQL 参数。当 查询 特定 的 项目(例如 特定 的 轨道 而不是 所有 轨道)时,在 客户端 中,我们 将 使用 带有id
参数 的 查询,该 参数 将 通过 服务器 端 的 这个args
参数 可用。我们 将 在 发射 III 中 进一步 讨论 这 一 点。 - contextValue
contextValue
是 一个 在 为 特定 操作 执行 的 所有 解析器 之间 共享 的 对象。解析器 需要 这个 参数 来 共享 状态,例如 身份 验证 信息、数据库 连接,或者 在 我们 的 案例 中 为RESTDataSource
。 - 信息
info
包含 关于 操作 的 执行 状态 的 信息,包括 字段 名称、从 根 开始 到 字段 的 路径 以及 更 多 内容。它 的 使用 频率 不 如 其他 参数 高,但 在 进行 更 高级 的 操作(例如 在 解析器 级别 设置 缓存 策略)时 会 很有用。
contextValue
参数 的 用途 是 什么?为 字段 spaceCats
编写 一个 空 的 解析器 函数,其中 包含 上述 的 所有 四 个 参数。该 函数 不应 返回 任何 内容。使用 箭头 函数 语法。
在本 课程 中,我们 将 专注 于 contextValue
,传递 给 每个 解析器 函数 的 第三 个 位置 参数。让我们 深入 研究 它。
分享 你 关于 本 节课 的 问题 和 评论
你的 反馈 有助于 我们 改进!如果你 遇到 了 困难 或 困惑,请 告诉 我们,我们会 帮助 你。所有 评论 都 是 公开 的,并且 必须 遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。
您需要一个 GitHub 帐户才能在下面发布。没有吗? 改为在我们的 Odyssey 论坛上发布。