使用 Fastify 构建 GraphQL API 的完整教程

GraphQL 是一种由 Facebook 发明的数据查询语言,它可以让客户端定义需要返回哪些数据,并且不会浪费带宽和服务器资源。Fastify 是一个低开销且高度效率的 Node.js web 框架。这篇文章将向你介绍如何使用 Fastify 构建一个 GraphQL API 服务。

准备工作

在开始之前,我们需要安装 Node.js 和 npm(或 yarn)。你可以通过以下链接下载和安装它们:

创建一个新的空目录,并在其中打开命令行终端。初始化该目录并安装必需的依赖:

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

编写 API

首先,让我们创建一个 index.js 文件,并从导入 Fastify 和 Fastify 插件开始:

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

然后,自动加载多个路由和插件:

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

在目录 ./routes 中,我们可以创建一个名为 graphql.js 的文件。该文件将包含我们 GraphQL API 的所有定义:

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

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

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

在该文件中,我们注册了 Fastify CORS 插件以解决跨域问题。然后,我们使用 fastify-gql 插件创建 GraphQL API。最后,我们定义 /graphql 路由的处理程序,该处理程序将处理所有的 GraphQL 操作。

在接下来的部分中,我们将更详细地讨论 schema 对象,并提供一个完整的代码示例。

定义 schema

一个 GraphQL schema 定义了可以从 API 中获取的所有数据类型、查询、变异、订阅等。以下是一个简单的例子:

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

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

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

在这个示例中,我们定义了一个名为 Query 的类型,其中包含一个名为 hello 的字段,其类型为 String

在实际项目中,我们通常会定义许多其他类型,例如 “User”、“Product”、“Order” 等等。这种复杂的类型定义可能需要使用 makeExecutableSchema 函数,该函数允许我们传递一个包含类型定义和一个可选的解析器对象的 JavaScript 对象。

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

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

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

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

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

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

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

在这个示例中,我们定义了三个类型:UserQueryMutation。我们还提供了类型解析器的对象,该对象定义了这些类型的实际行为。例如,user 查询实际上应该查询数据库并返回一个用户对象。

编写解析器

我们在上一节中定义了一个 schema,但 schema 并不能充分发挥作用,因为 GraphQL 的类型解析器还没实现。在解析器中,我们需要定义每个 GraphQL 映射到的函数。

以查询 allUsers 为例。我们的 schema 如下:

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

我们需要添加该查询的解析器:

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

该解析器使用一个名为 db 的属性,它将连接到作为上下文传递的数据库。反过来,我们可以使用它来查询数据库并返回所需的数据。

完整的示例代码

以下是完整的代码示例:

index.js

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

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

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

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

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

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

./routes/graphql.js

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

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

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

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

-

./schema.js

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

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

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

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

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

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

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

结论

在本教程中,我们使用 Fastify 构建了一个 GraphQL API,并解释了如何使用 Fastify 的自动加载插件、CORS 插件和 GraphQL 插件来构建一个完整的 API 服务。我们还讨论了如何定义 GraphQL schema 和解析器,并提供了一个完整的示例代码。

尽管 GraphQL 只是近期出现的技术,但它已经广泛使用了,特别是在 React 和 Vue.js 等前端框架中。如果你正在寻找一种优秀的数据查询语言,那么 GraphQL 是一个很好的选择!

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