5. 解析器 的 形状
3m

我们 的RESTDataSource 已经 可以 使用 了,但 我们 还没有 任何 来 使用 它!

一个 的 任务 是 为 你 的 架构 中 的 一个 填充 数据。 的 任务 是 实现 这些

究竟 什么 是 一个 ?解析器 是 一个 函数。它 的 名字 与 它 为 之 填充 数据 的 相同。它 可以 从 任何 获取 数据,然后 将 这些 数据 转换为 客户端 所需 的 形状。

Hand-drawn illustration depicting a resolver function retrieving data from data-land

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 client
tracksForHome: () => {},
}
以下 关于 解析器 的 说法 中,哪些 是 正确 的?

我们 的 将 如何 与 我们 的 相互 作用?这 就是 contextValue 发挥 作用 的 地方。 函数 具有 特定 的 签名,其中 包含 四 个 可选 参数: parentargscontextValueinfo

Hand-drawn illustration depicting a resolver function signature with its four parameters
tracksForHome: (parent, args, contextValue, info) => {},

让我们 简要 地 了解 一下 每个 参数 的 作用

  • 父级
    parent 是 该 父级 的 的 返回 值。这 在 处理 解析器 链 时 会 很有用。
  • 参数
    args 是 一个 对象,其中 包含 所有 由 GraphQL 为 该 提供 的 所有 。当 特定 的 项目(例如 特定 的 轨道 而不是 所有 轨道)时,在 客户端 中,我们 将 使用 带有 id ,该 参数 将 通过 服务器 端 的 这个 args 参数 可用。我们 将 在 发射 III 中 进一步 讨论 这 一 点。
  • contextValue
    contextValue 是 一个 在 为 特定 执行 的 所有 之间 共享 的 对象。解析器 需要 这个 来 共享 状态,例如 身份 验证 信息、数据库 连接,或者 在 我们 的 案例 中 为 RESTDataSource
  • 信息
    info 包含 关于 的 执行 状态 的 信息,包括 名称、从 根 开始 到 字段 的 路径 以及 更 多 内容。它 的 使用 频率 不 如 其他 参数 高,但 在 进行 更 高级 的 操作(例如 在 级别 设置 缓存 策略)时 会 很有用。
contextValue 参数 的 用途 是 什么?
代码 挑战!

为 字段 spaceCats 编写 一个 空 的 解析器 函数,其中 包含 上述 的 所有 四 个 参数。该 函数 不应 返回 任何 内容。使用 箭头 函数 语法。

在本 课程 中,我们 将 专注 于 contextValue,传递 给 每个 函数 的 第三 个 位置 。让我们 深入 研究 它。

上一步

分享 你 关于 本 节课 的 问题 和 评论

你的 反馈 有助于 我们 改进!如果你 遇到 了 困难 或 困惑,请 告诉 我们,我们会 帮助 你。所有 评论 都 是 公开 的,并且 必须 遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。

您需要一个 GitHub 帐户才能在下面发布。没有吗? 改为在我们的 Odyssey 论坛上发布。