本页内容

如何在 Deno 中使用 Apollo

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

我们将启动一个简单的 Apollo 服务器,它将允许我们查询一些本地数据。我们只需要三个文件来完成此操作

  1. schema.ts 用于设置我们的数据模型
  2. resolvers.ts 用于设置我们将在模式中填充数据字段的方式
  3. 我们的 main.ts,服务器将在其中启动

我们将从创建它们开始

touch schema.ts resolvers.ts main.ts

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

在此处查看源代码。

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 查询,则将整个列表传递给客户端,或者如果用户请求 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 以及来自模式的 typeDefs 和我们的解析器

import { ApolloServer } from "npm:@apollo/server@^4.1";
import { startStandaloneServer } from "npm:@apollo/[email protected]/standalone";
import { graphql } from "npm:[email protected]";
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 的更多信息.