为你的图谱创建蓝图
如果是新用户,我们建议查看我们的入门起飞系列,它介绍了与本教程相同的概念,并提供有用的视频和交互式代码挑战。完成起飞系列还将授予你 Apollo 图表开发者 - 助理认证,让你轻松与世界分享你的新技能!
如果你熟悉 Apollo,则本课程涵盖了构建常见的实用功能,如身份验证、分页和状态管理。
每个 图谱 使用 模式 来定义它包含的数据类型。例如,一个在线书店的模式可能包括以下类型:
# A book has a title and an authortype Book {title: Stringauthor: Author}# An author has a name and a list of bookstype Author {name: Stringbooks: [Book]}
在下面的步骤中,我们将设置一个 GraphQL 服务器,该服务器将强制执行我们模式的结构,然后我们将定义该模式本身。
设置 Apollo Server
只有当我们的 图谱 符合模式的结构时,模式才有用。强制执行模式结构是 Apollo Server 的核心特性之一,它是具有强大功能的开源库,可帮助我们实现图谱的 API。
从start/server
目录,让我们安装 Apollo Server(以及我们项目的其他依赖项):
cd start/server && npm install
要开始使用,您需要以下两个包Apollo Server:apollo-server
和graphql
,这两个包都是通过上述命令安装的。
现在,在/server
目录中,让我们导航到src/index.js
,以便我们可以创建服务器。将以下代码粘贴到文件中:
// We will cover using dotenv in a later lessonrequire("dotenv").config();const { ApolloServer } = require("apollo-server");const typeDefs = require("./schema");const server = new ApolloServer({ typeDefs });
此代码从apollo-server
导入ApolloServer
类,以及从src/schema.js
(目前未定义)导入我们的模式。然后创建一个新的ApolloServer
实例,并通过typeDefs
属性传入导入的模式。
现在,Apollo Server已准备好接收我们的模式,让我们定义它。
定义您模式中的类型
您的GraphQL 模式定义客户端可以读取和写入图中的哪些类型的数据。模式具有强类型性能,可解锁强大的开发者工具。
您的模式的结构应支持客户端将要执行的操作。
- 获取所有即将到来的火箭发射列表
- 通过其 ID 获取特定的发射情况
- 用户登录
- 为登录用户预订发射
- 为登录用户取消之前预订的发射
让我们设计我们的模式,使其操作简单直观。
在server/src/schema.js
中,从apollo-server
导入gql
并创建一个名为typeDefs
的模式变量:
const { gql } = require("apollo-server");const typeDefs = gql`# Your schema will go here`;module.exports = typeDefs;
模式将包含在 gql
函数内部(反引号之间)。我们用来编写模式的语言是 GraphQL 的模式定义语言(SDL)。
由于模式位于您的应用程序客户端和底层数据服务之间,前端和后端团队应该合作以确定其结构。当您开发自己的 图形 时,实践 模式优先开发 并在开始实现您的 API 之前达成一致。对于需要协作进行 GraphQL 模式 设计和实施的团队,强烈推荐使用 Apollo GraphOS。 Apollo GraphOS 可以帮助团队协作完成这项任务。
对象类型
GraphQL 模式中大多数定义都是 对象类型。您定义的每个 对象类型 都应表示客户端可能需要与之交互的对象。
例如,在我们的示例应用中,需要能够检索即将进行的火箭发射的列表,因此我们应该定义一个 Launch
类型来支持这种行为。
在 typeDefs
声明中的反引号内粘贴以下内容 server/src/schema.js
:
type Launch {id: ID!site: Stringmission: Missionrocket: RocketisBooked: Boolean!}
该 Launch
对象类型有一个 字段 集合,并且每个 字段 都有其自己的类型。字段的类型可以是 对象类型 或 标量类型。标量类型是一种原始类型(例如 ID
、String
、Boolean
、Int
或 Float
)并且解析为单个值。除了 GraphQL 内置的标量类型外,您还可以定义 自定义标量类型。
在声明字段类型之后一个感叹号(!
)表示“此字段的值不能为空。”
在上面的 Launch
定义中,Mission
Rocket
指的是其他对象类型。让我们为它们添加定义,以及User
类型(同样,所有都在反引号内):
type Rocket {id: ID!name: Stringtype: String}type User {id: ID!email: String!trips: [Launch]!token: String}type Mission {name: StringmissionPatch(size: PatchSize): String}enum PatchSize {SMALLLARGE}
如果一个声明字段的类型是在 [方括号]
,它是一个指定类型的数组。如果数组后面有一个感叹号,则该数组不能为空,但它可以是空的。。
注意上面的missionPatch
字段的Mission
类型接受一个名为参数size,它是一个枚举类型sizePatchSize
。当你查询需要参数的字段时,字段值会根据提供的参数值而变化。在这种情况下,你提供的size
将确定返回哪个大小的任务相关 patch(小尺寸或大尺寸)。
查询类型 Query
我们已经定义了存在在我们的图中的对象,但客户端还没有一种方式来检索这些对象。为了解决这个问题,我们的架构需要定义客户端可以对图访问的查询。
你定义你的图支持的查询作为特殊类型Query的字段。将以下内容粘贴到你的架构定义中:
type Query {launches: [Launch]!launch(id: ID!): Launchme: User}
此 查询
类型定义了三种可供客户端执行的查询:launches
,launch
,和 me
。
- 执行
launches
查询 会返回所有即将进行的Launch
es 列表。 - 执行
launch
查询 会返回与提供的id
参数相对应的单个Launch
。 - 执行
me
查询 会返回当前登录的User
的详细信息。
突变
类型
查询使客户端能够获取数据,但不能修改数据。要使客户端能够修改数据,我们的模式需要定义一些 突变。
此 突变
类型与 查询
类型结构相似。将以下内容粘贴到您的模式定义中:
type Mutation {bookTrips(launchIds: [ID]!): TripUpdateResponse!cancelTrip(launchId: ID!): TripUpdateResponse!login(email: String): User}
此 突变
类型定义了三种可供客户端执行的突变: bookTrips
,cancelTrip
,和 login
。
- 执行
bookTrips
突变 允许登录用户预订一个或多个Launch
s(指定为 launch ID 的数组)。 - 执行
cancelTrip
突变 允许登录用户取消之前预订的行程。 - 执行
login
突变 允许用户提供他们的电子邮件地址来登录。
函数 bookTrips
和 cancelTrip
返回相同的 object type:一个 TripUpdateResponse
。一个 mutation 的返回类型完全由你决定,但我们建议定义专门用于mutation响应的特殊 object types。
将 TripUpdateResponse
的定义添加到您的模式中:
type TripUpdateResponse {success: Boolean!message: Stringlaunches: [Launch]}
此响应类型包含一个 success
状态,相应的 message
,以及任何被 mutation 修改的 Launch
的数组。将mutation修改的对象返回是一种好习惯,这样请求客户端可以更新其缓存和UI,而不需要执行后续的 query。
我们的示例应用的模式现在已完成!
运行您的服务器
在 server/src/index.js
的末尾添加以下调用:
server.listen().then(() => {console.log(`Server is running!Listening on port 4000Explore at https://studio.apollographql.com/sandbox`);});
保存后,运行 npm start
以启动您的服务器! 🎉 Apollo Server 已在 https://127.0.0.1:4000
中提供。
探索您的模式
现在我们的服务器正在运行,我们可以使用有用的开发者工具来 introspect 它的模式类型和 fields。稍后,我们还将能够使用这些工具运行测试查询。
Introspection 是一个有帮助的 GraphQL 功能,允许您在开发目的下获取服务器模式。在生产环境中应 禁用。 Apollo Server 如果将 NODE_ENV
环境变量设置为 production
,则会自动禁用 introspection。
Apollo Studio Explorer 是一个强大的网络集成开发环境(IDE),用于探索您的 GraphQL schema 和构建针对它的查询:
Apollo 沙盒是 Apollo Studio 的一个特殊模式,允许您在没有 Apollo 账户的情况下使用 Studio 功能。让我们试试吧!
访问 studio.apollographql.com/sandbox。当沙盒打开时,它将自动尝试连接到您运行在 https://127.0.0.1:4000
的服务器。
要在沙盒中内省您的服务器模式,请点击左侧的“文档”选项卡
您的模式的根类型(Query
和 Mutation
)显示出来。您可以点击任何类型来查看其 字段并深入模式。您会看到类型和字段与我们提供给服务器的一致。
我们的服务器现在知道它支持哪些 GraphQL 类型和 操作,但不知道从哪里获取数据来响应这些操作。接下来,我们将把服务器连接到两个 数据源。