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

阅读时长 12 分钟读完

前言

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 服务。希望这篇文章对您有所帮助。

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

纠错
反馈

纠错反馈