接上篇 —— Apollo 入门引导(二):连接数据源 —— 继续翻译 Apollo 的官网入门引导。
学习 GraphQL 的查询是如何获取数据的。
Apollo 入门引导 - 目录:
- 介绍
- 构建 schema
- 连接数据源
- 编写查询解析器
- 编写变更解析器
- 连接 Apollo Studio
- 创建 Apollo 客户端
- 通过查询获取数据
- 通过变更修改数据
- 管理本地状态
完成时间:15 分钟
前一节已经设计了 schema 并配置了数据源,但是服务不知道如何使用其数据源来填充 schema 字段。为了解决这个问题,接下来将定义一个解析器(resolver)集合。
**解析器的功能是负责为 schema 中的字段填充数据。**每当客户端查询特定字段时,该字段的解析器都会从适当的数据源中获取请求的数据。
解析器函数返回以下之一:
- 解析器对应 schema 字段所需的类型的数据(字符串,整数,对象等)
- 满足所需类型数据的期约(promise)
解析器函数签名
在开始编写解析器之前,先介绍一下解析器函数的签名是什么样的。解析器函数接受四个可选参数:
fieldName: (parent, args, context, info) => data;
参数 | 描述 |
---|---|
parent |
这是该字段的父级的解析器的返回值(父级解析器始终在其子字段的子级解析器之前执行)。 |
args |
该对象包含为此字段提供的所有GraphQL 参数。 |
context |
该对象在执行特定操作的所有解析器之间共享。使用此参数可以共享每个操作的状态,例如身份验证信息和对数据源的访问。 |
info |
其中包含有关操作执行状态的信息(仅在高级情况下使用) |
在这四个参数中,我们定义的解析器将主要使用 context
参数。它使我们的解析器可以共享 LaunchAPI
和 UserAPI
数据源实例。要了解其工作原理,下面就开始创建一些解析器。
定义顶级解析器
如上所述,父字段的解析器始终在其子字段的子解析器之前执行。因此,先从一些顶级字段的解析器开始定义:Query
类型。
正如 src/schema.js
所示,我们 schema 的 Query
类型定义了三个字段:launches
、 launch
和 me
。要为这些字段定义解析器,请打开 src/resolvers.js
并粘贴以下代码:
module.exports = {
Query: {
launches: (_, __, { dataSources }) =>
dataSources.launchAPI.getAllLaunches(),
launch: (_, { id }, { dataSources }) =>
dataSources.launchAPI.getLaunchById({ launchId: id }),
me: (_, __, { dataSources }) => dataSources.userAPI.findOrCreateUser(),
},
};
如该代码所示,我们在**映射(map)*