5. Apollo Server
4m

概述

我们的模式已经很完善了,但我们需要一个 服务器 来真正使用它来满足它接收的请求!

在本课中,我们将

  • 设置

🛠 后端第一步

在后端,我们的首要目标是创建一个 可以:

  1. 接收来自客户端的
  2. 根据我们新创建的模式验证
  3. 用模拟数据填充查询到的模式
  4. 将填充的 作为响应返回。

Apollo Server 库帮助我们快速、轻松地以生产就绪的方式实现此服务器。

添加服务器依赖项

要开始使用我们的服务器,我们首先需要几个包@apollo/servergraphqlgraphql-tag

  • @apollo/server 包提供了一个完整的、符合规范的
  • graphql 包提供了解析和验证 查询的核心逻辑。
  • graphql-tag 包提供了 gql 模板字面量,我们将在稍后使用它。

在项目根目录中打开一个新的终端,运行以下命令

npm install @apollo/server graphql graphql-tag

这些包负责我们项目启动和运行所需的所有 相关配置。

实现 Apollo Server

src 文件夹中,打开 index.ts

我们将从一些导入开始。要创建我们的服务器,我们将使用之前安装的 @apollo/server 包。从该包中,我们将导入 ApolloServer。我们还需要使用 startStandaloneServer 函数,我们可以从 @apollo/server/standalone 包中导入。

index.ts
import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";

要引入 schema.graphql 的内容,我们需要一些额外的导入。

index.ts
import { readFileSync } from "fs";
import path from "path";
import { gql } from "graphql-tag";

我们将同时使用 readFileSyncpath 实用程序来读取 schema.graphql 文件的内容。我们导入的 gql 实用程序是一个标记模板字面量,用于包装 字符串,例如我们即将导入的模式定义!这将 GraphQL 字符串转换为 Apollo 库在处理 和模式时预期的格式,并且它还支持语法高亮。

在这些导入下方,我们将添加一行,将所有这些导入组合在一起并读取我们的模式文件。

index.ts
const typeDefs = gql(
readFileSync(path.resolve(__dirname, "./schema.graphql"), {
encoding: "utf-8",
})
);

接下来,让我们设置一个名为 startApolloServerasync 函数。在其中,我们将创建 ApolloServer 类的实例,并将我们的 typeDefs 传递到它的选项对象中:

index.ts
async function startApolloServer() {
const server = new ApolloServer({ typeDefs });
}

注意: 我们正在使用隐式键的简写属性表示法,因为我们用匹配的键(typeDefs)命名了我们的常量。

要启动服务器,我们将使用 startStandaloneServer 函数,并将我们刚刚初始化的 server 传递给它。

index.ts
async function startApolloServer() {
const server = new ApolloServer({ typeDefs });
startStandaloneServer(server);
}

startStandaloneServer 函数返回一个 Promise,因此我们将 await 该调用的结果,并将 url 属性从结果中提取出来。

index.ts
async function startApolloServer() {
const server = new ApolloServer({ typeDefs });
const { url } = await startStandaloneServer(server);
}

我们还将记录一条简单的消息,让我们知道我们的服务器确实启动并运行了!

index.ts
async function startApolloServer() {
const server = new ApolloServer({ typeDefs });
const { url } = await startStandaloneServer(server);
console.log(`
🚀 Server is running!
📭 Query at ${url}
`);
}

最后,别忘了在文件底部实际调用 startApolloServer 函数!

index.ts
startApolloServer();

保存您的更改。从终端,我们将 我们的服务器,使用 npm run dev

我们得到了日志消息,以及……除此之外没有别的!我们有一个运行的服务器,但仅此而已。它漂浮在 localhost 空间的真空之中,无法访问任何数据,它现在是一个悲伤而孤独的服务器。 😿

终端输出
🚀 Server is running!
📭 Query at https://127.0.0.1:4000/

即使我们的服务器还没有连接到任何 ,我们仍然可以向它发送一个测试 并得到一个有效的响应;让我们在下一课中研究一下。

练习

以下哪些是 GraphQL 服务器的目的?

关键要点

  • 是一个库,我们可以用它来接收 查询、验证它们、填充请求的 并将数据返回给客户端。
  • 我们可以通过传入我们的 类型定义来初始化一个新的 实例。

接下来

让我们使用一些模拟数据试用一下我们的服务器。在下一课中,我们将探索一个开发环境,它为我们提供了进入 API 所需的一切。

上一页

分享您对此课的疑问和评论

本课程目前处于

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

您需要一个 GitHub 帐户才能在下方发布。没有帐户? 请在我们的 Odyssey 论坛中发布。