在 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


猜你喜欢

  • 从 ES5 到 ES6:使用 bind 解决 this 指向问题

    在前端开发中,this 指向问题一直是一个让开发者头疼的难题,然而 ES6 的 bind 方法为解决 this 指向问题提供了一种优雅的解决方案。在本文中,我们将介绍从 ES5 到 ES6 这一过程中...

    14 天前
  • CSS Grid 代码片段分享:轻松实现复杂布局

    CSS Grid 是前端开发中一种新的布局模式,在比较短的时间内得到了广泛的应用。它可以帮助我们轻松地实现各种复杂布局,如网格、定位和居中等。 本文将分享一些实践中常用的 CSS Grid 代码片段,...

    14 天前
  • Serverless 架构常见错误及其解决方法

    什么是 Serverless 架构? Serverless 架构是一种全新的云计算架构,它将基础设施的管理交由云服务供应商,使开发者只需专注于业务代码。在 Serverless 架构中,只需要编写业务...

    14 天前
  • 使用 Vuetify 实现 Material Design 效果的指南

    Material Design 是 Google 推出的一套设计语言,旨在以自然、简单和直观的方式展现 UI 元素。而 Vuetify 则是一个基于 Vue.js 的 Material Design ...

    14 天前
  • 将 ES5 代码转换至 ES12 的工具和技巧

    在前端开发中,我们经常需要将旧的代码升级至较新的版本,以便能够享受新语法带来的方便或修复已有语法的问题。本文将会介绍将 ES5 代码转换至 ES12 的工具和技巧,以及相关的学习和指导意义。

    14 天前
  • CSS Reset 的规范化之路

    在前端开发中,CSS Reset 是一个非常重要的概念。它的作用是在各种浏览器和环境下,让元素的默认样式一致。这样可以避免不同浏览器或不同环境下出现的样式差异问题,并且更好地控制页面的布局和样式。

    14 天前
  • 解决使用 TailwindCSS 后元素位置发生偏移的问题

    TailwindCSS 是一套快速、现代化的 CSS 框架,它允许前端开发人员使用简单的命令即可快速构建用户界面。然而,一些开发者反映在使用 TailwindCSS 后,界面中的元素位置发生了偏移的问...

    14 天前
  • 从 Promise 到 Observable:Angular 应用中 RxJS 的使用实践

    RxJS 是 ReactiveX 巨大家族中的 JavaScript 实现。它提供了一组用于处理异步操作的工具,其中最重要的工具是 Observable。类似于 Promise,Observable ...

    14 天前
  • ES11 之 DecentJS 让 JavaScript 更加优雅

    在现代 Web 开发中,JavaScript 是必不可少的一门语言。它的灵活性和易用性使得开发者能够深入了解用户需求和不断推出新的功能。然而,JavaScript 也常常被看作是一门难以维护和理解的语...

    14 天前
  • React 中的错误处理及其解决方法

    在 React 开发中,错误处理是一个非常重要的话题。没有良好的错误处理,代码可能会出现难以调试的问题。在这篇文章中,我将会介绍 React 中的错误处理方法,包括一些错误的种类以及如何防止和处理它们...

    14 天前
  • RESTful API的接口文档自动生成技术

    RESTful API是一种基于HTTP协议的Web API设计风格,特点是简单、统一、无状态。由于RESTful API的规范性,越来越多的Web开发者采用RESTful API作为应用程序的接口。

    14 天前
  • 使用 Fastify 和 MongoDB 合并数据

    在现代 Web 开发中,前端开发已经不再只是一种简单的页面渲染,而是一个后端与前端协作完成的工作。为了提高数据传输效率和应用性能,将多个不同数据源的数据进行合并已经成为了前端应用程序中非常重要的一环。

    14 天前
  • 优化响应式图片加载体验的技巧

    在 Web 页面中,图片是必不可少的元素之一,特别是在现代移动设备普及的情况下,响应式图片的需求愈加迫切。然而,响应式图片加载起来比较耗时,这也会影响用户的体验。因此,在这篇文章中,我们将探讨如何优化...

    14 天前
  • Docker 容器中如何安装 MySQL 客户端?

    随着 Docker 技术在前端开发中越来越受欢迎,我们经常需要在 Docker 容器中安装 MySQL 客户端以便连接到 MySQL 数据库,并且管理和操作数据库。

    14 天前
  • Vue.js SPA 页面打包后图片 404 问题解决方案

    当我们使用 Vue.js 开发单页应用(SPA)时,常常会遇到打包后静态资源文件(如图片、样式表等)的 404 问题。这是因为在开发模式下,我们可以使用相对路径去引用各种资源。

    14 天前
  • Sequelize 和 SQLite:如何将多对多表插入关系?

    当我们使用 Sequelize 和 SQLite 构建 web 应用时,通常需要使用多对多关系来关联两个实体。本文将介绍如何使用 Sequelize 和 SQLite 将多对多表插入关系。

    14 天前
  • Redis 与 Server-sent Events 结合的实践

    在现代化的 Web 应用程序中,实时数据的处理和推送已经成为了必要的功能。与此同时,由于 Web 的本质,许多应用程序需要处理大量的并发请求。Redis 是一个快速且功能强大的内存数据库,它可以作为一...

    14 天前
  • Kubernetes 的卷调度器(Volume Scheduler)与 Pod 调度器有何不同?

    Kubernetes 的卷调度器 (Volume Scheduler) 是 Kubernetes 中的一种新功能,它与 Pod 调度器有许多不同之处。在本文中,我们将深入研究这两种调度器的不同之处,以...

    14 天前
  • ES7 的 async/await,从入门到完美掌握

    在过去的几年里,JavaScript 迅速增长并成为了一种应用广泛的语言。这个进展中最大的变化之一就是 ES7 中的 async/await。这个特性对于异步代码的处理提供了许多改进,让开发者更容易地...

    14 天前
  • Serverless 实现持续部署的最佳实践

    Serverless 架构已经成为现代云服务中的一个热门话题,它就是将开发者从运维和管理服务器的压力中解放出来,使得开发者可以专注于应用的开发和创新。而持续部署则是目前软件开发中不可缺少的一部分,它可...

    14 天前

相关推荐

    暂无文章