使用 Deno 开发 GraphQL 服务器的最佳实践

GraphQL 是一种使用查询语言来从服务器获取数据的 API 规范。使用 GraphQL,前端开发人员可以非常容易地获取所需的数据,而无需去请求多个不同的 RESTful API 接口。目前,GraphQL 在前端开发中越来越受欢迎,而 Deno 作为一个类似于 Node.js 的 JavaScript 和 TypeScript 运行时环境,也提供了便利的功能以便使用 GraphQL 来编写服务器端应用程序。本文将讲解使用 Deno 开发 GraphQL 服务器的最佳实践。

安装 Deno 和相关依赖

在使用 Deno 开发 GraphQL 服务器之前,我们需要先安装 Deno 和相关依赖。你可以访问 Deno 的官方网站 (https://deno.land/) 下载并安装 Deno。同时,我们还需要安装一些 Deno 的模块,包括如下模块:

  • oak:一个相对于 Koa 框架的使用 Deno 编写的 Web 应用框架。
  • graphql:一个可以让我们定义 GraphQL schema 和 resolver 方法的 JavaScript 模块。

你可以使用以下命令来进行安装:

$ deno install --allow-read --allow-net https://deno.land/x/install/install.js
$ deno install --allow-read --allow-net --allow-env --allow-run main.ts
$ deno install --allow-read --allow-net --allow-env --allow-run --no-check https://deno.land/x/mod.land/mod.ts
$ deno install --allow-env --allow-net https://deno.land/x/ntdb_server/main.ts
$ deno install --allow-env --allow-net https://deno.land/x/ntdb/main.ts

定义 GraphQL schema

在使用 Deno 开发 GraphQL 服务器时,我们需要首先定义我们的 GraphQL schema。在 GraphQL schema 中,我们定义了我们的数据模型以及与这些数据模型交互的方法。我们使用 graphql 模块中的 GraphQLSchemaGraphQLObjectType 来定义我们的 schema。

下面是一个示例 schema 声明:

import {
  GraphQLSchema,
  GraphQLObjectType,
  GraphQLString,
  GraphQLInt,
  GraphQLList,
  GraphQLNonNull
} from "graphql";

const UserType = new GraphQLObjectType({
  name: "User",
  fields: () => ({
    id: { type: GraphQLInt },
    name: { type: GraphQLString },
    age: { type: GraphQLInt }
  })
});

const QueryType = new GraphQLObjectType({
  name: "Query",
  fields: () => ({
    users: {
      type: new GraphQLList(UserType),
      resolve: () => {
        // ... 
      }
    }
  })
});

const MutationType = new GraphQLObjectType({
  name: "Mutation",
  fields: () => ({
    addUser: {
      type: UserType,
      args: {
        name: { type: new GraphQLNonNull(GraphQLString) },
        age: { type: new GraphQLNonNull(GraphQLInt) }
      },
      resolve: (root, args) => {
        // ...
      }
    }
  })
});

const schema = new GraphQLSchema({
  query: QueryType,
  mutation: MutationType
});

在上面的示例代码中,我们定义了一个名为 User 的对象类型,以及一个名为 Query 和名为 Mutation 的对象类型,这两者用来定义查询和变异方法。我们使用 GraphQLIntGraphQLString 等类型来定义属性的数据类型。

定义 GraphQL resolver

在 GraphQL schema 中定义的方法必须要有相应的 resolver 函数来处理这些请求。我们可以在 QueryTypeMutationType 中的函数中添加 resolver 函数。

下面是一个示例 resolver 函数:

const resolvers = {
  Query: {
    users() {
      //...
    },
  },
  Mutation: {
    addUser(root, args) {
      //...
    },
  },
};

在上面的示例中,我们返回了一个 users 方法和一个 addUser 方法。这些方法接受相关参数,并使用它们来处理请求。返回结果的格式应该与相应 GraphQL 查询的格式相对应。

使用 Deno 和 Oak 编写 GraphQL API

在定义好我们的 schema 和 resolver 之后,我们可以使用 Deno 和 Oak 来编写我们的 GraphQL API。

下面是一个示例 API 声明:

import { Application } from "https://deno.land/x/oak/mod.ts";
import { applyGraphQL } from "https://deno.land/x/oak_graphql/mod.ts";
import { schema } from "./schema.ts";
import { resolvers } from "./resolvers.ts";

const app = new Application();

const GraphQLService = await applyGraphQL({
  path: "/graphql",
  typeDefs: schema,
  resolvers,
});

app.use(GraphQLService.routes(), GraphQLService.allowedMethods());

console.log("Server started on http://localhost:8000");

await app.listen({ port: 8000 });

上面的示例中,我们使用 applyGraphQL() 方法来创建 GraphQL 服务。在服务的挂载路径和 schema 和 resolver 必须要正确匹配。当服务启动后,我们可以在浏览器中访问 http://localhost:8000/graphql 查看是否运行成功。

总结

本文简要介绍了使用 Deno 开发 GraphQL 服务器的最佳实践,包括如何定义 GraphQL schema 和 resolver、使用 Deno 和 Oak 来编写 GraphQL API。希望读者们能够通过本文的讲解了解有关使用 Deno 开发 GraphQL 服务器的基础知识。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b621c0add4f0e0ffed2af7