在 Node.js 中用 GraphQL 构建大型 API 系统

GraphQL 是一种新型的 Web API 查询语言,它允许客户端指定需要获取的数据并精确控制返回的数据结构。相比于传统的 RESTful API,GraphQL 可以极大地简化前后端之间的信息交换。在本文中,我们将介绍如何在 Node.js 中使用 GraphQL 构建大型 API 系统。

准备工作

使用 GraphQL 构建 API 系统需要几个必要的组件:

  • GraphQL Schema:Schema 是一个用于定义查询和数据类型的描述语言。我们需要一个由类型和字段组成的 Schema 来描述我们的数据模型。
  • GraphQL Server:负责实现我们定义的 Schema,并且能够处理客户端的查询请求。
  • GraphQL Client:可以使用任何语言实现,用于向服务器发送 GraphQL 查询请求并接收响应。

除此之外,我们还需要使用一些常用的 Node.js 模块来完成 GraphQL API 的构建,具体包括以下模块:

  • graphqlexpress-graphql:这两个模块可以帮助我们构造 GraphQL API 服务器。
  • mongoose:用于操作 MongoDB 数据库,是 Node.js 开发中最流行的 ORM 框架之一。

定义 Schema

首先,我们需要定义一个包含所有 GraphQL Query 和 Mutation 的 Schema。我们可以将这个 Schema 放在一个独立的模板文件中,在需要的时候加载它。

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

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

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

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

我们定义了一个 User 类型,其中包含了 _id、name、age、sex 等字段,以及对 User 类型的 Query 和 Mutation 定义。

Query 包含了 user 和 users 两个查询方法,其中 user 方法接收一个 _id 参数,并返回指定 _id 的 User 对象。users 方法返回所有 User 对象的列表。

Mutation 包含了 addUser、updateUser 和 deleteUser 三个操作方法,它们分别用于添加、更新和删除 User 对象。

实现 Query 和 Mutation 操作

一旦我们定义了 Schema,就需要将其实现为操作方法。在这里,我们使用了 mongoose 模块来操作 MongoDB 数据库。

通过 mongoose 模块,我们可以简单地定义 User Schema:

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

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

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

接下来,我们可以实现 Query 和 Mutation 方法:

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

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

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

我们首先导入 User 模型,然后编写常规的 CRUD 操作方法。例如,在 addUser 方法中,我们创建一个新的 User 对象,并将其保存到数据库中。在 updateUser 方法中,我们使用 findByIdAndUpdate 方法查找指定 _id 的 User 对象,并更新其属性。在 deleteUser 方法中,我们使用 findByIdAndDelete 方法删除指定 _id 的 User 对象。

创建 GraphQL 服务器

我们现在已经拥有了定义好的 Schema 和实现好的 Resolver,需要创建一个 GraphQL 服务器来将它们连接起来。

运行以下命令安装 graphql 和 express-graphql 模块:

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

接下来,在 Node.js 服务文件中,我们可以使用以下代码来创建一个简单的 GraphQL 服务器:

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

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

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

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

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

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

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

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

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

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

这里,我们使用了 express 模块来创建 HTTP 服务器,使用 express-graphql 模块来处理 GraphQL 查询请求。我们通过 makeExecutableSchema 函数将 Schema 和 Resolver 连接起来,并创建了一个包含了 GraphQL 的 Endpoint 的 /graphql 路由。

发送 GraphQL 查询

我们可以使用任何支持 GraphQL 的客户端来向我们的服务器发起查询请求。这里我们使用了 GraphiQL,它是一个交互式的 GraphQL 查询工具,非常方便。

在浏览器窗口中,打开 http://localhost:3000/graphql,就可以进入 GraphiQL 中。

在 GraphiQL 页面上方的区域里,可以编写需要发送的 GraphQL 查询。我们可以向服务器发送如下查询:

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

我们可以查询指定 id 的 User 对象的 _id、name 和 age 属性。在执行查询后,服务器会返回 User 对象的 JSON 结构。

除了查询操作,还可以执行 Mutation 操作。例如,我们可以使用如下代码向服务器发送一个添加 User 对象的请求:

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

服务器返回新创建的 User 对象,并将其 _id、name、age、sex 属性一并返回。

结论

在本文中,我们介绍了如何使用 GraphQL 在 Node.js 中构建复杂的 API 系统。通过定义 GraphQL Schema,实现 Resolver 和创建 GraphQL 服务器,我们可以轻松地构建出具有可维护性和灵活性的 API 服务,并可以用任何支持 GraphQL 的客户端与其进行交互。这份代码已经放在了 GitHub 上,供需要的开发者参考使用。

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