2. 构建模式
15m

为你的图谱创建蓝图

如果是新用户,我们建议查看我们的入门起飞系列,它介绍了与本教程相同的概念,并提供有用的视频和交互式代码挑战。完成起飞系列还将授予你 Apollo 图表开发者 - 助理认证,让你轻松与世界分享你的新技能!


如果你熟悉 Apollo,则本课程涵盖了构建常见的实用功能,如身份验证、分页和状态管理。

每个 使用 模式 来定义它包含的数据类型。例如,一个在线书店的模式可能包括以下类型:

# A book has a title and an author
type Book {
title: String
author: Author
}
# An author has a name and a list of books
type Author {
name: String
books: [Book]
}

在下面的步骤中,我们将设置一个 ,该服务器将强制执行我们模式的结构,然后我们将定义该模式本身。

设置 Apollo Server

只有当我们的 符合模式的结构时,模式才有用。强制执行模式结构是 Apollo Server 的核心特性之一,它是具有强大功能的开源库,可帮助我们实现图谱的 API。

start/server 目录,让我们安装 (以及我们项目的其他依赖项):

cd start/server && npm install

要开始使用,您需要以下两个包apollo-servergraphql,这两个包都是通过上述命令安装的。

现在,在/server目录中,让我们导航到src/index.js,以便我们可以创建服务器。将以下代码粘贴到文件中:

server/src/index.js
// We will cover using dotenv in a later lesson
require("dotenv").config();
const { ApolloServer } = require("apollo-server");
const typeDefs = require("./schema");
const server = new ApolloServer({ typeDefs });

此代码从apollo-server导入ApolloServer类,以及从src/schema.js(目前未定义)导入我们的模式。然后创建一个新的ApolloServer实例,并通过typeDefs属性传入导入的模式。

任务!

现在,已准备好接收我们的模式,让我们定义它。

定义您模式中的类型

您的定义客户端可以读取和写入图中的哪些类型的数据。模式具有强类型性能,可解锁强大的开发者工具。

您的模式的结构应支持客户端将要执行的操作。

  • 获取所有即将到来的火箭列表
  • 通过其 ID 获取特定的情况
  • 用户登录
  • 为登录用户预订
  • 为登录用户取消之前预订的

让我们设计我们的模式,使其操作简单直观。

server/src/schema.js中,从apollo-server导入gql并创建一个名为typeDefs的模式变量:

server/src/schema.js
const { gql } = require("apollo-server");
const typeDefs = gql`
# Your schema will go here
`;
module.exports = typeDefs;

模式将包含在 gql 函数内部(反引号之间)。我们用来编写模式的语言是 的模式定义语言()。

由于模式位于您的应用程序客户端和底层数据服务之间,前端和后端团队应该合作以确定其结构。当您开发自己的 时,实践 模式优先开发 并在开始实现您的 API 之前达成一致。对于需要协作进行 设计和实施的团队,强烈推荐使用 Apollo GraphOS。 Apollo GraphOS 可以帮助团队协作完成这项任务。

对象类型

GraphQL 模式中大多数定义都是 对象类型。您定义的每个 都应表示客户端可能需要与之交互的对象。

例如,在我们的示例应用中,需要能够检索即将进行的火箭发射的列表,因此我们应该定义一个 Launch 类型来支持这种行为。

typeDefs 声明中的反引号内粘贴以下内容 server/src/schema.js:

server/src/schema.js
type Launch {
id: ID!
site: String
mission: Mission
rocket: Rocket
isBooked: Boolean!
}

Launch 对象类型有一个 字段 集合,并且每个 都有其自己的类型。字段的类型可以是 对象类型标量类型。标量类型是一种原始类型(例如 IDStringBooleanIntFloat)并且解析为单个值。除了 内置的标量类型外,您还可以定义 自定义标量类型

在声明字段类型之后一个感叹号(!)表示“此字段的值不能为空。”

在上面的 Launch 定义中,MissionRocket指的是其他对象类型。让我们为它们添加定义,以及User类型(同样,所有都在反引号内):

server/src/schema.js
type Rocket {
id: ID!
name: String
type: String
}
type User {
id: ID!
email: String!
trips: [Launch]!
token: String
}
type Mission {
name: String
missionPatch(size: PatchSize): String
}
enum PatchSize {
SMALL
LARGE
}

如果一个声明字段的类型是在 [方括号],它是一个指定类型的数组。如果数组后面有一个感叹号,则该数组不能为空,但它可以是空的。

注意上面的missionPatch字段Mission类型接受一个名为参数size,它是一个枚举类型sizePatchSize。当你查询需要参数的字段时,字段值会根据提供的参数值而变化。在这种情况下,你提供的size将确定返回哪个大小的任务相关 patch(小尺寸或大尺寸)。

查询类型 Query

我们已经定义了存在在我们的中的对象,但客户端还没有一种方式来检索这些对象。为了解决这个问题,我们的架构需要定义客户端可以对查询。

你定义你的支持的查询作为特殊类型的字段。将以下内容粘贴到你的架构定义中:

server/src/schema.js
type Query {
launches: [Launch]!
launch(id: ID!): Launch
me: User
}
任务!

查询 类型定义了三种可供客户端执行的查询:launcheslaunch,和 me

  • 执行 launches 会返回所有即将进行的 Launches 列表。
  • 执行 launch 会返回与提供的 id 相对应的单个 Launch
  • 执行 me 会返回当前登录的 User 的详细信息。

突变 类型

查询使客户端能够获取数据,但不能修改数据。要使客户端能够修改数据,我们的模式需要定义一些 突变

突变 类型与 查询 类型结构相似。将以下内容粘贴到您的模式定义中:

server/src/schema.js
type Mutation {
bookTrips(launchIds: [ID]!): TripUpdateResponse!
cancelTrip(launchId: ID!): TripUpdateResponse!
login(email: String): User
}

突变 类型定义了三种可供客户端执行的突变: bookTripscancelTrip,和 login

  • 执行 bookTrips 允许登录用户预订一个或多个 Launchs(指定为 ID 的数组)。
  • 执行 cancelTrip 允许登录用户取消之前预订的行程。
  • 执行 login 允许用户提供他们的电子邮件地址来登录。

函数 bookTripscancelTrip 返回相同的 :一个 TripUpdateResponse。一个 的返回类型完全由你决定,但我们建议定义专门用于mutation响应的特殊

TripUpdateResponse 的定义添加到您的模式中:

server/src/schema.js
type TripUpdateResponse {
success: Boolean!
message: String
launches: [Launch]
}

此响应类型包含一个 success 状态,相应的 message,以及任何被 修改的 Launch 的数组。将mutation修改的对象返回是一种好习惯,这样请求客户端可以更新其缓存和UI,而不需要执行后续的

任务!

我们的示例应用的模式现在已完成!

运行您的服务器

server/src/index.js 的末尾添加以下调用:

server/src/index.js
server.listen().then(() => {
console.log(`
Server is running!
Listening on port 4000
Explore at https://studio.apollographql.com/sandbox
`);
});

保存后,运行 npm start 以启动您的服务器! 🎉 Apollo Server 已在 https://127.0.0.1:4000 中提供。

任务!

探索您的模式

现在我们的服务器正在运行,我们可以使用有用的开发者工具来 introspect 它的模式类型和 。稍后,我们还将能够使用这些工具运行测试查询。

是一个有帮助的 功能,允许您在开发目的下获取服务器模式。在生产环境中应 禁用 如果将 NODE_ENV 环境变量设置为 production,则会自动禁用

Apollo Studio Explorer 是一个强大的网络集成开发环境(IDE),用于探索您的 和构建针对它的查询:

Studio Explorer tab

Apollo 沙盒是 Apollo Studio 的一个特殊模式,允许您在没有 Apollo 账户的情况下使用 Studio 功能。让我们试试吧!

访问 studio.apollographql.com/sandbox。当沙盒打开时,它将自动尝试连接到您运行在 https://127.0.0.1:4000 的服务器。

要在沙盒中内省您的服务器模式,请点击左侧的“文档”选项卡

Explorer documentation tab

您的模式的根类型(QueryMutation)显示出来。您可以点击任何类型来查看其 并深入模式。您会看到类型和字段与我们提供给服务器的一致。

我们的服务器现在知道它支持哪些 类型和 ,但不知道从哪里获取数据来响应这些操作。接下来,我们将把服务器连接到两个

上一页