deno.com
本页内容

如何在 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

让我们逐一进行设置。

在此处查看源代码。

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 跳到标题

解析器负责填充每个查询的数据。这里我们有恐龙列表,解析器将做的就是:如果用户请求 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 中,我们将从 schema 和我们的解析器中导入 ApolloServergraphql 和我们的 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 的信息.

您找到所需内容了吗?

隐私政策