如何构建实时 GraphQL API

面试官:小伙子,你的数组去重方式惊艳到我了

如何构建实时 GraphQL API

GraphQL 是一种 API 查询语言和运行时,用于在应用程序中使用提供的数据。GraphQL 的优势包括减少网络传输量、提供更好的类型检查和可扩展性。本文将介绍如何使用 GraphQL 构建实时 API,以及如何在客户端订阅数据更改。

构建实时 GraphQL API

首先,我们需要创建一个 GraphQL API,以便客户端可以查询数据。在本文中,我们将使用 Apollo Server。通过创建一个 GraphQL schema ,开发人员可以指定客户端可以查询的数据字段和类型。

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

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

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

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

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

在上面的代码中,我们定义了 User 和 Query 类型。通过在 User 类型中添加 id 和 name 字段,我们确定了客户端可以查询的数据。在 Query 类型中,我们定义了两个操作:user 和 users。user 操作将返回一个指定 ID 的用户,而 users 操作将返回所有用户。

此外,我们还定义了一个 Subscription 类型,它表示可以订阅的事件。在这种情况下,我们定义了 userAdded 事件,该事件将在每次添加新用户时触发。

在定义了 GraphQL schema 后,我们可以使用 Apollo Server 来创建实际 API。我们可以在服务器上使用以下代码:

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

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

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

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

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

在上面的代码中,我们使用了 typeDefs 来定义我们的 schema。我们还定义了 resolvers ,以便处理客户端发出的每个查询和订阅请求。

在 Query 类型中定义的 user 和 users 操作有一个对应的 resolver,它将返回相应的数据。在 Subscription 类型中定义的 userAdded 事件也有一个对应的 resolver,它将创建一个订阅,以便将来可以向客户端发送事件。

在以上代码的最后,我们使用 ApolloServer 构造函数创建了一个实例,并调用其 listen 方法来启动服务器。

通过运行上面的示例代码,我们现在可以在浏览器中打开 GraphQL Playground,并发出查询请求。

在左侧的查询窗格中,我们可以发出以下查询:

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

这将返回以下响应:

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

现在我们已经创建了一个基本的 GraphQL API,我们可以开始添加实时功能。

向 GraphQL API 添加实时功能

为了向 GraphQL API 添加实时功能,我们需要使用 PubSub(发布-订阅)模式。PubSub 模式允许后端服务器向前端客户端发送事件,而不需要客户端请求。在我们的示例应用程序中,我们将创建一个 Mutation ,每当向用户数组添加新用户时,PubSub 将发送一个事件。

下面是如何修改 resolvers 以实现此目标的代码:

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

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

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

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

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

我们添加了 Mutation 类型,以便客户端可以添加新用户。在 addUser resolver 中,我们将新创建的用户添加到数组中,并使用 pubsub.publish 方法发送一个 userAdded 事件,以便通知前端客户端。

在上述代码中,我们还更新了 Subscription resolver,以确保每次添加新用户时客户端都会收到用户。

在这里我们可以尝试我们的 Mutation:

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

运行 Mutation 后还需要使用 Subscription 去对添加数据进行监听:

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

这将在客户端代码中启动一个 WebSocket 连接,并在每次调用 addUser Mutation 时接收 userAdded 事件。

客户端订阅数据更改

在原生的 GraphQL 语言中,没有提供实时查询,需要使用 Subscription 来解决这个问题。订阅查询参数与其他查询参数类似。只需在文档对象模型(DOM)中使用实时查询函数而不是执行普通查询。

在这里我们将使用 react-apollo 来订阅数据更改。

首先,我们需要创建一个查询:

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

接下来,我们可以使用一个简单的组件来渲染查询结果和一个订阅,以便及时更新用户列表。

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

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

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

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

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

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

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

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

在上述代码中,我们将用户列表作为 useQuery 的结果呈现,这将在加载应用程序时运行一次,然后使用 useSubscription 常量订阅用户列表中添加的任何新用户列表。

此外,我们通过检查 subscriptionData 是否存在,以及将其添加到用户数组中来进行实时更新。

结论

本文展示了如何使用 GraphQL 和 Apollo Server 来构建带有实时功能的 API,以及如何使用 PubSub 模式来处理实时数据。通过使用订阅,我们可以在服务器端发生变化时向订阅端发送事件,以便及时更新客户端的数据。

通过在 graphql-playground 中测试以及使用 react-apollo 订阅,我们可以轻松地使用此框架构建实时应用程序,这将在数据变化时为用户提供更好的用户体验。

已完结,谢谢。

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


猜你喜欢

  • 如何解决响应式布局中图片失真的问题

    在响应式布局中,图片失真是一个常见的问题。对于前端开发来说,如何解决这个问题不仅能提高用户体验,还能优化网站性能。在本文中,我们将会探讨几种常见的解决方法,并且给出示例代码和指导意义。

    2 小时前
  • 深入研究 Webpack 衍生项目 electrode-webpack-reporter

    前言 Webpack 已经成为了现代 Web 开发中最流行的 JavaScript 模块打包工具之一。但是,当你在处理复杂的 Webpack 配置或大型项目时,常常遇到令人困惑的问题和错误。

    2 小时前
  • 如何处理 MongoDB 中的嵌套文档?

    在 MongoDB 中,可以使用嵌套文档来组织数据。嵌套文档的使用可以使数据更具结构性和可读性。但是,在进行嵌套文档的处理时,需要注意一些细节,否则会导致性能问题或者不易维护的代码。

    2 小时前
  • 使用 Jest 測試 Node.js 應用

    Jest 是 Facebook 推出的一款 JavaScript 測試框架。它不仅可以用来测试前端代码,还可以用来测试 Node.js 應用。在这篇文章中,我们将介绍如何使用 Jest 去測試 Nod...

    2 小时前
  • CSS Grid 完全指南:快速入门与优化实践

    CSS Grid 是一个强大的前端布局工具,可以帮助开发者更轻松地实现复杂的网页布局。本文将针对 CSS Grid 进行详尽解析,并提供快速入门与优化实践,以帮助读者更好地掌握 CSS Grid。

    2 小时前
  • 如何在 GraphQL 中使用 JWT 实现认证和授权

    GraphQL 是一种新型的 API 技术,旨在改善传统 RESTful API 的缺陷。其中,认证和授权是构建安全和可靠 API 的必要组成部分。JWT(JSON Web Token)是一种流行的认...

    2 小时前
  • Enzyme 中如何测试 React 组件中的 Ref

    Enzyme 中如何测试 React 组件中的 Ref React 中的 Ref (也称引用)提供了对组件的直接引用,使得开发人员可以访问组件内部的 DOM 堆栈。

    2 小时前
  • 如何使用 Headless CMS 和 Gatsby 构建 PWA

    什么是 Headless CMS? Headless CMS 是一个相对新的概念,它与传统的 CMS 不同,Headless CMS 不依赖于前端框架或模板引擎,而是提供纯 API 接口来管理数据和内...

    2 小时前
  • 通过 RxJS 掌握 JavaScript 异步编程

    介绍 JavaScript 是一门单线程的语言,因此它不能像其他语言那样同时处理多个任务。如果在一个任务没有完成之前,程序需要处理其他任务,那么就需要使用异步编程。 不过,传统的异步编程方式非常棘手。

    2 小时前
  • ES11 中引入的 bigints

    在 JavaScript 中,数字类型默认使用双精度浮点数来表示。虽然这种浮点数可以表示大多数数字,但是它有一些明显的缺点。例如,浮点数不能表示整数,因为它们只能表示一定的数量级范围。

    2 小时前
  • 如何在 Next.js 中实现用户认证?

    Next.js 是一个流行的 React 框架,可帮助我们构建 SSR(服务器端渲染)应用程序。使用 Next.js 的一个好处是它可以帮助我们更好地管理用户认证。

    2 小时前
  • 构建 API:使用 Fastify 和 ElasticSearch 进行全文搜索

    在现代的 Web 应用中,搜索功能变得越来越重要,因为它使用户能够轻松地找到他们需要的信息。对于任何内容丰富的网站或网络应用,快速、准确地搜索功能会成为其必要组成部分。

    2 小时前
  • Webpack 优化实践:提高页面打开速度

    Webpack 是一个强大的前端打包工具,但是如果不合理配置,会拖慢页面的加载速度。本文将介绍一些优化实践,帮助您提高页面打开速度。 1. 代码分离 代码分离是优化 webpack 的重要手段之一,目...

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

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

    2 小时前
  • CSS Grid 代码片段分享:轻松实现复杂布局

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

    2 小时前
  • Serverless 架构常见错误及其解决方法

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

    2 小时前
  • 使用 Vuetify 实现 Material Design 效果的指南

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

    2 小时前
  • 将 ES5 代码转换至 ES12 的工具和技巧

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

    2 小时前
  • CSS Reset 的规范化之路

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

    2 小时前
  • 解决使用 TailwindCSS 后元素位置发生偏移的问题

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

    3 小时前

相关推荐