如何使用 Apollo server 和 GraphQL,构建高效的 Node.js 服务器

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

随着现代 Web 应用程序对 API 数量、性能和可扩展性的要求越来越高,GraphQL、Node.js 和 Apollo Server 成为构建高效的服务器端应用程序的技术之一。本文将介绍如何使用 Apollo Server 和 GraphQL,构建高效的 Node.js 服务器。

什么是 Apollo Server?

Apollo Server 是一个用于构建 GraphQL API 的库。它是基于 Node.js 平台中最流行的开发框架之一,express的基础上构建的。它支持多种数据源,包括数据库、REST API、服务间通信等等。而且它也支持多语言,如 JavaScript、TypeScript、Go、Java、Scala 等等。

什么是 GraphQL?

GraphQL 是一种用于构建 API 的查询语言,由Facebook在2012年提出,它提供了一种更高效、强大、灵活和可定制化的方式来请求数据。GraphQL 真正的优势在于它允许客户端定义数据的结构及其关系,而不是从服务器端获取预定义的数据结构。因此,GraphQL API 可以精确地提供客户端请求的数据,从而提高了应用程序的性能。

安装并设置 Apollo Server

首先,我们需要全局安装 nodemon 依赖:

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

接着,我们新建一个项目并安装相关依赖:

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

接下来,我们设置 Apollo Server。创建一个新文件, server.js

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

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

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

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

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

创建一个用于定义 schema 的变量 typeDefs,并用于定义 Query Resolver 的变量 resolvers。接着,我们将它们传入 ApolloServer 中,然后监听在本地的默认端口 4000

运行:

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

现在访问 http://localhost:4000/graphql 地址就可以打开 GraphQL Playground。

查询和变异(Query and Mutation)

查询

最简单的查询是指定其名字:

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

这将返回:

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

变异

我们可以定义一个简单的变异,它将把两个整数加起来:

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

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

我们定义了名为 sum 的查询与名为 sayHello 的变异。现在,我们可以这样查询:

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

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

这样将返回:

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

数据源

我们可以使用 REST API、数据库、JavaScript 对象数组和运行在其他服务器上的其他服务作为我们的 GraphQL API 数据源。这里我们使用一个伪造的数据库情况——并且,这也是内存数据源池的情况。

首先,让我们声明两个数据模型:

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

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

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

users 数组用于存储用户的数据(id,姓名,所属团队的id),teams 数组用于存储队伍的数据(id,名称)。

这是我们的查询解析器的实现:

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

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

我们自定义了 UserTeam 类型的解析器。User 解析器获取与该用户关联的队伍;Team 解析器获取与该团队关联的所有成员。

现在,我们可以查询所有用户、所有团队、指定的用户或团队。

在GraphQL Playground中,我们输入以下内容:

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

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

这将返回:

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

现在我们需要将 Apollo Server 中的伪造数据替换为从数据库获取数据的方式。

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

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

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

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

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

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

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

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

我们使用 Mongoose 在 MongoDB 中定义了 UserTeam 模型。现在,我们需要将模型传递给 Apollo Server 的 context 选项。

接下来我们来调整查询和解析器,使其适应 MongoDB 并插入初始的几条数据:

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

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

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

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

-------

现在,我们可以查询所有用户、所有团队、指定的用户或团队。而且,相比于我们之前在内存中伪造数据进行的操作,我们现在引入了 MongoDB 数据库。

在GraphQL Playground中,我们输入以下内容:

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

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

结论

在本文中,我们以 Apollo Server 和 GraphQL 为基础介绍了如何构建高效的 Node.js 服务器。我们开始学习如何设置 Apollo Server,如何定义和解析器和查询和变异。随后,我们以不同的数据源为基础,演示了其查询和变异的用法以及它们的解析器。最后,我们把内存数据持久化到了 MongoDB 中。

GraphQL 是一个出色的解决方案,如果你想构建强壮、高效并且可扩展的 API,考虑使用它。而 Apollo Server 则是它的首选实现,因为具备极高的灵活性和可扩张性。

完整代码:

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

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

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

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

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

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

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

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

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

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

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

-------

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

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/672b3978ddd3a70eb6d23305


猜你喜欢

  • Docker 安装移动硬盘出现的麻烦解决

    Docker 是一个流行的容器化技术,它能够让开发者在不同的环境中轻松构建、分发和运行应用程序。不过,当你尝试在 Docker 中安装移动硬盘时,可能会遇到一些问题。

    2 天前
  • 在 Jest 测试框架中使用 ECMAScript 2021(ES12)语法

    Jest 是一个流行的 JavaScript 测试框架,它允许开发者测试他们的项目和代码,以确保其正确性和可维护性。在本文中,我们将讨论如何在 Jest 中使用 ECMAScript 2021(ES1...

    2 天前
  • TypeScript 中函数的重载和泛型的选择和使用

    TypeScript 中函数的重载和泛型的选择和使用 在 TypeScript 中,函数是重要的编程元素,常常应用于编写前端代码中的模块和 Web 应用程序。为了使函数能够更加灵活和复用,TypeSc...

    2 天前
  • AngularJS 如何获取完整的 URL

    AngularJS 如何获取完整 URL AngularJS 是一款流行的前端框架,它为我们提供了全面的解决方案来快速构建前端应用程序。在许多情况下,我们需要获取当前浏览器中的完整 URL 地址,以便...

    2 天前
  • Material Design 实现选项卡遇到的问题及解决方法

    简介 选项卡是一个经常出现在 Web 应用中的 UI 组件,可以将不同的内容分组展示,并方便用户进行快速切换。而 Material Design 是 Google 推出的一种跨平台 UI 设计语言,其...

    2 天前
  • GraphQL 优化:如何在 Go 中提高性能

    GraphQL 是一种新型的 API 查询语言,它通过定义数据格式和查询语法来使客户端能够按需查询数据。GraphQL 的出现使得前端开发人员可以更方便地获取需要的数据,而无需受限于后端 API 的固...

    2 天前
  • 如何在 Angular 中使用 Web Components

    前言 在前端开发领域,组件化是一个非常重要的概念。为了提高开发效率和复用性,前端技术发展出了各种各样的组件化方案。其中,Web Components 是一种比较新的技术方案,它的目标是让开发人员能够轻...

    2 天前
  • Less 中的变量覆盖优化方法

    在前端开发中,我们经常使用 CSS 预处理器来简化样式表的编写。Less 是常用的 CSS 预处理器之一,它提供了很多强大的功能,例如变量、嵌套、混合等。其中,变量是 Less 最常用的功能之一,它可...

    2 天前
  • 如何在 Deno 中使用正则表达式

    正则表达式是前端开发过程中非常重要的一部分。它可以用于验证用户输入,解析文本,提取数据等。在 Deno 中,使用正则表达式也非常简单。 什么是正则表达式 正则表达式是一个字符串的模式匹配方法。

    2 天前
  • 使用 Express.js 和 React 创建完整的 WEB 应用的步骤

    在前端开发中,使用基于 JavaScript 的框架和库来开发 WEB 应用已成为主流。而 Express.js 和 React 作为最流行的基于 JavaScript 的框架和库之一,已经被广泛应用...

    2 天前
  • 开发者要求掌握的无障碍测试方法

    随着互联网的不断发展,越来越多的人依赖于网络和应用程序进行日常生活。然而,不同的人有不同的能力,比如视力、听力、运动能力等等。开发者在开发前端应用程序的时候,需要意识到无障碍测试的重要性,以确保所有用...

    2 天前
  • Docker 部署方式探讨:Kubernetes 和 Swarm 的比较

    随着云计算和容器化技术的普及,Docker 的应用越来越广泛,而 Docker 的部署方式也越来越多样化。其中,Kubernetes 和 Swarm 是两种流行的 Docker 部署方式。

    2 天前
  • Kubernetes 中如何访问不同命名空间的服务

    Kubernetes 是一个开源的容器编排系统,它可以帮助我们管理容器化应用程序的部署、扩展和运维。在 Kubernetes 中,我们可以通过命名空间(Namespace)来组合和隔离应用程序的资源。

    2 天前
  • Fastify 中使用插件的方法及插件推荐

    前言 Fastify 是一个高效的 Node.js Web 框架,具有快速、低内存消耗、安全性好、扩展性强等特点,被广泛应用在 Web 服务器、 API 开发等领域。

    2 天前
  • 在 React-Native 中使用 GraphQL - 完整指南

    引言 React-Native 是一个跨平台的移动应用程序开发框架,它使用 JavaScript 和 React 库来构建 Android 和 iOS 应用程序。GraphQL 是一种现代的数据查询和...

    2 天前
  • ES9 的新特性:Array.prototype.{push, splice, unshift}.at(),更方便地对数组进行成员操作

    ES9 的新特性:Array.prototype.{push, splice, unshift}.at() ES9(又称 ECMAScript 2018)是 JavaScript 的一个版本,它带来了...

    2 天前
  • 使用 AngularJS 构建 SPA 时常见的错误排查

    AngularJS 是一种流行的前端框架,以其能够轻松构建单页应用程序(SPA)而著称。然而,在使用 AngularJS 进行开发时,难免会遇到一些错误和问题。本文将介绍一些常见的 AngularJS...

    2 天前
  • Redux 中故障排除与性能优化技巧

    作为一种流行的前端框架,Redux 提供了状态管理的一种可预测性和可维护性的方式。然而,在使用它的时候,我们也会面临一些故障和性能问题。本文将介绍 Redux 中常见的故障排除和性能优化技巧,并提供一...

    2 天前
  • 使用 Sequelize 连接 PostgreSQL

    在现代 Web 开发中,PostgreSQL 是一个常用的关系型数据库。在 Node.js 的开发中,有许多模块可以帮助我们连接并管理 PostgreSQL 数据库。

    2 天前
  • Cypress 如何模拟事件来测试应用程序的行为

    前言 Cypress是一个现代的JavaScript测试框架,它不仅可以测试web应用程序的各种场景,而且使用起来非常方便和灵活。在测试中,模拟各种事件是很重要的,例如点击、键盘输入、鼠标移动等。

    2 天前

相关推荐

    暂无文章