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 的构建,具体包括以下模块:
- graphql 和 express-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