用 Deno 构建 GraphQL 服务器的完整指南

阅读时长 12 分钟读完

在构建现代 web 应用程序时,GraphQL 是不可或缺的技术。它提供了一个强大的查询语言和服务端执行引擎,以便客户端可以轻松地请求和获取数据。虽然 GraphQL 最初是由 Facebook 开发的,但现在它已经成为一个通用的规范,被广泛应用于各种 web 应用程序。

在本篇文章中,我们将学习如何使用 Deno 构建 GraphQL 服务器。Deno 是一种新的 JavaScript 运行时环境,具有更好的安全性和模块化,并且可以在没有 Node.js 的情况下运行。我们将会学习如何使用一些最流行的库,如 Oak、Deno DB 和 GraphQL Helix 来构建一个完整的 GraphQL 服务器。

什么是 GraphQL?

GraphQL 是一种用于 web 应用程序中的查询语言和服务端执行引擎。它提供了一个强大的类型系统,以便开发人员可以定义所需数据的类型和结构。客户端可以使用 GraphQL 查询语言请求数据,服务端解析并返回请求的数据。

GraphQL 的最大好处之一是,它可以控制返回的数据量,以避免过多或缺乏所需的数据。它还可以缩短请求和响应之间的距离,使应用程序更快。

GraphQL 组件

GraphQL 应用程序通常由三个主要组件组成:

  1. Schema - GraphQL 的 schema 定义了数据类型和结构。它有助于开发人员定义所需数据的结构,并且客户端可以使用查询语言请求数据。

  2. Resolvers - Resolvers 负责解析客户端请求,并在必要时从数据源中检索数据。GraphQL 将请求路由到正确的 resolver,并将数据组装到所请求的结构中。

  3. 型处理程序 (Type Handlers) - Type Handlers 可以在 resolver 响应之前或之后修改响应数据。它们通常用于转换数据和添加元数据。

准备工作

在我们开始构建 GraphQL 服务器之前,我们需要确保 Deno 和一些依赖项已经安装好。我们需要安装以下依赖项:

  • Oak - 用于构建 web 服务器的框架。

  • Deno DB - 用于与数据库交互的 Deno ORM 库。

  • GraphQL Helix - 用于构建 GraphQL 服务器的库。

可以使用以下命令在 Deno 中安装这些依赖项:

步骤 1: 创建模型和数据库

首先,我们需要创建模型和数据库。我们将使用 Deno DB 来与数据库进行交互。

我们将使用 Post 模型来表示帖子,它具有 idtitlecontent 属性。

创建名为 models.ts 的文件,并将以下代码添加到该文件中:

-- -------------------- ---- -------
------ - ------ --------- - ---- ------------------------------------

------ ----- ---- ------- ----- -
  ------ ----- - --------
  ------ ---------- - -----

  ------ ------ - -
    --- -
      ----- ---------------
      ----------- -----
      ------------- -----------------
    --
    ------ -----------------
    -------- ---------------
  --
-

接下来,我们需要创建数据库。我们将使用 SQLite 数据库,并将其保存在 data.db 文件中。

创建名为 db.ts 的文件,并将以下代码添加到该文件中:

-- -------------------- ---- -------
------ - --------- ---------------- - ---- ------------------------------------
------ - ---- - ---- --------------

----- --------- - --- ------------------
  --------- ------------
---

----- -- - --- --------------------

----------------

----- --------- ----- ---- ---

在上面的代码中,我们创建了一个名为 connector 的 SQLite3 连接器,并将其连接到名为 data.db 的文件。我们还通过 db.link() 方法将 Post 模型与数据库连接起来。最后,我们使用 db.sync() 方法将模型同步到数据库中。

步骤 2: 创建 GraphQL Schema

接下来,我们需要创建一个 GraphQL schema。GraphQL schema 定义了数据类型和结构。

创建名为 schema.ts 的文件,并将以下代码添加到该文件中:

-- -------------------- ---- -------
------ -
  ------------------
  --------------
  --------------
  ------------
  ---------------
- ---- ----------------------------------

------ - ---- - ---- --------------

----- -------- - --- -------------------
  ----- -------
  ------- -- -- --
    --- - ----- ------------- --
    ------ - ----- ------------- --
    -------- - ----- ------------- --
  ---
---

----- --------- - --- -------------------
  ----- --------
  ------- -
    ------ -
      ----- --- ----------------------
      -------- ----- -- -- -
        ------ ----- --------------------
      --
    --
    ----- -
      ----- ---------
      ----- -
        --- - ----- ----------------------------- --
      --
      -------- ----- -------- ----- -- -
        ----- - -- - - -----
        ------ ----- ---------------- ------------
      --
    --
  --
---

------ ----- ------ - --- ---------------
  ------ ----------
---

在上面的代码中,我们创建了一个 PostType GraphQLObjectType,它定义了 Post 模型的类型和结构。我们还创建了一个 RootQuery GraphQLObjectType,它包含了两个查询字段:postspostposts 字段返回所有帖子的数组,而 post 字段接受 id 参数,并返回指定的帖子。

最后,我们将 RootQuery 添加到 GraphQL schema 中,并将其导出。

步骤 3: 创建 Resolvers

接下来,我们需要创建 resolver。Resolver 负责解析客户端请求,并在必要时从数据源中检索数据。

创建名为 resolvers.ts 的文件,并将以下代码添加到该文件中:

-- -------------------- ---- -------
------ - ---- - ---- --------------

------ ----- --------- - -
  ------ -
    ----- ------- -
      ----- ----- - ----- --------------------
      ------ ------
    --
    ----- ------------ - -- -- -
      ----- ---- - ----- ---------------- ------------
      ------ -----
    --
  --
  --------- -
    ----- ------------------ - ------ ------- -- -
      ----- ---- - ----- -------------
        ------
        --------
      ---

      ------ -----
    --
    ----- ------------------ - --- ------ ------- -- -
      ----- ---- - ----- ---------------- ------------

      -- ------- -
        ----- --- ----------- ---- -- ----- ---- --- --------
      -

      ---------- - ------
      ------------ - --------

      ----- --------------

      ------ -----
    --
    ----- ------------------ - -- -- -
      ----- ---- - ----- ---------------- ------------

      -- ------- -
        ----- --- ----------- ---- -- ----- ---- --- --------
      -

      ----- --------------

      ------ -----
    --
  --
--

在上面的代码中,我们创建了一个 resolvers 对象,其中包含了 QueryMutation 字段的解析器。Query 字段具有 postspost 解析器,用于返回所有帖子和单个帖子。Mutation 字段具有 createPostupdatePostdeletePost 解析器,用于创建、更新和删除帖子。

步骤 4: 创建 GraphQL Server

现在,我们已经定义了 GraphQL schema 和 resolvers,我们需要将这些组件连接起来,并创建我们的 GraphQL 服务器。

创建名为 server.ts 的文件,并将以下代码添加到该文件中:

-- -------------------- ---- -------
------ - ----------- - ---- ---------------------------------
------ - -------------- - ---- ---------------------------------------------------------------------------
------ - -------------------- - ---- ----------------------------------------

------ - ------ - ---- --------------
------ - --------- - ---- -----------------

----- --- - --- --------------
----- ---------------- - ---------------------- --------- ------ ---

------------- ----- -- -
  ----- ------------------------
    ------- -----------------
    -------- ----
    ----------
  ---
---

------------------- ------- -- -------------------------
----- ------------ ----- ---- ---

在上面的代码中,我们创建了一个 Oak 应用程序,并将 GraphQL 服务作为中间件挂载到应用程序上。我们还使用 makeExecutableSchema() 方法将 schema 定义转换为可执行的 schema。最后,我们在端口 8080 上启动服务器。

步骤 5: 运行服务器

现在我们可以启动服务器并测试我们的 GraphQL API。

可以使用以下命令运行服务器:

GraphQL 服务器已经启动,现在我们可以在浏览器中访问 GraphQL Playground。

在浏览器中输入 http://localhost:8080/graphql,打开 GraphQL Playground。

在 Playground 中,我们可以查询和变异我们的 API。使用以下查询返回所有帖子:

使用以下查询返回指定的帖子:

使用以下变异创建新的帖子:

使用以下变异更新现有的帖子:

使用以下变异删除现有的帖子:

总结

Den,GraphQL Helix 和 Deno DB 是三个强大的工具,在构建 GraphQL 服务器方面具有非常好的帮助。在本文中,我们已经学习了如何将它们结合在一起,构建了一个完整的 GraphQL 服务器。我们了解了如何定义 GraphQL schema、编写 resolver、创建数据库,以及创建 Web 服务器来处理来自客户端的请求。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645df51b968c7c53b0050256

纠错
反馈