快速搭建一个基于 Fastify 的 GraphQL API

阅读时长 12 min read

前言

GraphQL 是一种 API 查询语言,通过定义类型和字段的方式来反映应用程序的数据模型。由于其灵活性和强大的查询能力,GraphQL 成为了许多应用程序的首选 API。

在本文中,我们将学习如何使用 Fastify 和 GraphQL 来快速搭建一个实用的 GraphQL API。Fastify 是一款高效且低开销的 Web 框架,可以轻松地处理高并发的请求处理场景,而且在很多情况下,Fastify 的性能也要优于其他 Node.js Web 框架。

准备工作

在开始本文的指导之前,请确保您拥有以下工具:

  • Node.js & npm
  • 一个文本编辑器

创建工程

首先,我们要创建一个新的工程。打开终端,进入您希望项目保存的目录,并执行以下命令:

上述命令创建了一个新的 Node.js 项目,并自动填充了 package.json 文件中的默认值。

接着,我们安装 Fastify 和必要的插件:

这些插件分别是:

  • Fastify:Fastify 框架本身。
  • GraphQL: 实现 GraphQL API 的核心库。
  • Fastify-autoload:用于自动加载在指定目录下的插件。
  • Fastify-cors:用于设置跨域请求的 CORS 响应头。

创建服务

我们将创建一个名为 server.js 的文件,作为我们的 GraphQL API 服务的入口点。将以下内容保存到您的 server.js 文件中:

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

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

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

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

这段代码引入了 Fastify 框架和我们即将使用的 Fastify-autoload 插件。我们还将创建一个 Fastify 实例并启用了日志记录功能,以便我们可以更方便地查看服务的运行情况。

我们还注册了以 plugins 目录为根目录的自动加载插件的功能,以便我们可以方便地将 API 的功能封装成独立的模块并按需引入。

最后,我们通过调用 Fastify 的 listen() 方法来启动服务器,监听在 3000 端口上。

如果一切顺利,启动服务时您应该会看到类似下面的输出:

请注意,如果端口 3000 已经被其他进程占用,Fastify 将会自动使用其他可用端口,而不是直接退出应用程序。

创建 GraphQL Schema

GraphQL Schema 是一个 JSON 对象,用于描述 API 服务中可以执行的操作和查询。在这个例子中,我们将创建一个简单的 GraphQL Schema,它将会暴露一个 Query 类型,允许我们查询一些假设的文章数据。

创建以下文件: plugins/graphql.js,它将是我们实际处理 GraphQL 查询请求的地方。

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

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

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

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

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

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

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

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

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

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

这段代码创建了一个 Fastify 插件,并通过 graphqlFastify 插件将 GraphQL API 绑定到 Fastify 实例上。我们还导出了一个带有 graphiql() 的函数,用于在浏览器中显示 GraphQL 的 GraphiQL 用户界面。

该函数使用 Fastify 实例暂时启动了一个 GraphiQL 界面,以显示默认请求。用户可以在此页面上编辑请求和查询,并在“Execute Query”按钮上执行请求。

除了 GraphiQL 单页应用程序之外,此函数还将指定响应的内容类型为 text/html,以确保浏览器正确地渲染该内容。

创建数据模型

在我们能够实现 GraphQL API 之前,我们需要创建一些数据类型,并定义我们将查询的数据属性。创建以下文件: plugins/schema.js

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

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

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

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

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

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

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

上述代码定义了 Author, PostQuery 三个 GraphQL 类型。Post 类型包含字段 id, titleauthor,它们都是基本数据类型。Author 由字段 id, firstNamelastName 组成。

Query 类型定义指定了我们要从 API 服务器中提取的属性列表。在本例中,我们仅指定 posts 属性,将它定义为返回一个 Post 数组。

最后,我们创建了一个 resolvers 对象,它包含了我们的查询函数,实际执行查询操作。

代码结构

运行服务

在前面的步骤中,我们已经创建了必要的文件。

现在,在终端中执行以下命令来启动 API 服务:

当服务运行时,请在浏览器中访问 GraphiQL 用户界面,地址为 http://localhost:3000/graphiql。您应该可以看到类似以下屏幕截图的内容:

现在您可以在此页面上编辑 GraphQL 查询并执行它们。例如,您可以将以下代码复制到查询框中,并点击“Execute Query”来执行查询操作:

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

如果一切顺利,您应该可以看到与以下响应类似的结果:

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

结语

本文向您展示了如何快速搭建一个基于 Fastify 的 GraphQL API 服务。我们介绍了 Fastify 和 GraphQL 的基础知识和用法,并通过示例代码和步骤,让您学习到如何搭建一个 GraphQL API 服务。希望这篇文章对您有所帮助。

Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d651b2a941bf7134c06e02

Feed
back