跳至主要内容

如何在 Deno 中使用 Apollo

Apollo Server 是一个 GraphQL 服务器,您可以在几分钟内设置它并与您现有的数据源(或 REST API)一起使用。然后,您可以将任何 GraphQL 客户端连接到它以接收数据并利用 GraphQL 的优势,例如类型检查和高效获取。

我们将创建一个简单的 Apollo 服务器并使其运行,它将允许我们查询一些本地数据。为此,我们只需要三个文件

  1. schema.ts 用于设置我们的数据模型
  2. resolvers.ts 用于设置如何填充我们 schema 中的数据字段
  3. 我们的 main.ts 文件,服务器将从这里启动

我们先创建它们

touch schema.ts resolvers.ts main.ts

让我们一步步设置每个文件。

查看源代码:[此处](link to source code)

schema.ts

我们的 schema.ts 文件描述了我们的数据。在本例中,我们的数据是恐龙列表。我们希望用户能够获取每个恐龙的名称和简短描述。在 GraphQL 语言中,这意味着 Dinosaur 是我们的 **类型**,而 namedescription 是我们的 **字段**。我们还可以定义每个字段的数据类型。在本例中,两者都是字符串。

这里也是我们使用 GraphQL 中特殊的 **Query** 类型来描述我们允许对数据进行的查询。我们有两个查询:

  • dinosaurs 获取所有恐龙的列表
  • dinosaur 以恐龙的 name 作为参数,返回该恐龙类型的信息。

我们将在 typeDefs 类型定义变量中导出所有这些内容

export const typeDefs = `
type Dinosaur {
name: String
description: String
}

type Query {
dinosaurs: [Dinosaur]
dinosaur(name: String): Dinosaur
}
`;

如果我们想写入数据,这里也是我们描述用于写入数据的 **Mutation** 的地方。Mutation 是使用 GraphQL 写入数据的方式。因为我们这里使用的是静态数据集,所以我们不会写入任何数据。

resolvers.ts

解析器负责填充每个查询的数据。这里我们有恐龙列表,解析器要做的事情就是 a) 如果用户请求 dinosaurs 查询,则将整个列表传递给客户端,或者 b) 如果用户请求 dinosaur 查询,则只传递一个恐龙信息。

const dinosaurs = [
{
name: "Aardonyx",
description: "An early stage in the evolution of sauropods.",
},
{
name: "Abelisaurus",
description: '"Abel\'s lizard" has been reconstructed from a single skull.',
},
];

export const resolvers = {
Query: {
dinosaurs: () => dinosaurs,
dinosaur: (_: any, args: any) => {
return dinosaurs.find((dinosaur) => dinosaur.name === args.name);
},
},
};

对于后者,我们将来自客户端的参数传递给一个函数,以将名称与我们数据集中名称进行匹配。

main.ts

在我们的 main.ts 文件中,我们将导入 ApolloServer 以及 graphql,以及来自 schema 的 typeDefs 和我们的解析器

import { ApolloServer } from "npm:@apollo/server@^4.1";
import { startStandaloneServer } from "npm:@apollo/server@4.1/standalone";
import { graphql } from "npm:graphql@16.6";
import { typeDefs } from "./schema.ts";
import { resolvers } from "./resolvers.ts";

const server = new ApolloServer({
typeDefs,
resolvers,
});

const { url } = await startStandaloneServer(server, {
listen: { port: 8000 },
});

console.log(`Server running on: ${url}`);

我们将 typeDefsresolvers 传递给 ApolloServer 来启动一个新的服务器。最后,startStandaloneServer 是一个帮助函数,可以快速启动并运行服务器。

运行服务器

现在剩下的就是运行服务器了。

deno run --allow-net --allow-read --allow-env main.ts

您应该在终端中看到 Server running on: 127.0.0.1:8000。如果您访问该地址,您将看到 Apollo 沙盒,我们可以在其中输入我们的 dinosaurs 查询。

query {
dinosaurs {
name
description
}
}

这将返回我们的数据集。

{
"data": {
"dinosaurs": [
{
"name": "Aardonyx",
"description": "An early stage in the evolution of sauropods."
},
{
"name": "Abelisaurus",
"description": "\"Abel's lizard\" has been reconstructed from a single skull."
}
]
}
}

或者,如果我们只想要一个 dinosaur

query {
dinosaur(name:"Aardonyx") {
name
description
}
}

它将返回

{
"data": {
"dinosaur": {
"name": "Aardonyx",
"description": "An early stage in the evolution of sauropods."
}
}
}

太棒了!

了解更多关于在他们的教程中使用 Apollo 和 GraphQL 的信息。.