GraphQL 中的订阅(Subscription)实例教程

GraphQL 是新一代 API 技术,它能提高前端和后端之间的数据交互效率,让 Web 服务开发变得更加容易和快速。其中,GraphQL 的 Subscription 特性是一项重要的功能,它允许前端实时订阅后端数据的变化,重新定义了数据交互的方式。本文将为大家讲解 GraphQL 中的订阅(Subscription)实例教程,通过详细的案例,帮助大家深入学习和掌握该功能的使用方法。

什么是 GraphQL Subscription?

GraphQL Subscription 是 GraphQL 的一项实时数据查询功能,通过 Subscription,前端可以实时订阅后端的数据变化,当后端数据发生变化时,前端能立即收到推送消息。这与传统的轮询方式相比,可以提高数据交互效率,减少无效请求,使 Web 应用更加流畅和响应式。

要使用 GraphQL Subscription,需要实现一个 Subscription Type,该类型包含一个订阅器(resolver function),在服务器端将新的数据推送给客户端。同时,前端也需要定义一个 Subscription Query,通过这个 Subscription Query 可以实时订阅后端数据的变化。

GraphQL Subscription 的使用示例

接下来,我们将通过一个具有实际意义的示例,讲解 GraphQL Subscription 的使用方法。

在本示例中,我们将使用一个具有实时性需求的聊天室,用户可以在该聊天室发送消息,同时能实时接收到其他用户发送的消息。以下是该示例实现的步骤:

1. 定义 GraphQL Schema

首先,我们需要定义 GraphQL Schema,用于描述我们要实现的数据模型和订阅功能。在该示例中,我们需要定义两个类型:Message 和 Subscription,其中 Message 类型用于描述聊天室中的消息,Subscription 类型用于实现消息推送功能。以下是该 Schema 的实现代码:

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

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

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

以上代码实现了 Message、Subscription、Query 三种类型,其中:

  • Message 类型定义了消息的 id、content 和 user;
  • Subscription 类型定义了名为 newMessage 的订阅器,该订阅器用于在有新消息时,通过指定的 resolver function,将新消息推送给客户端;
  • Query 类型定义了名为 messages 的查询,该查询返回所有之前发送的消息。

以上代码示例中,在 Subscription 类型中定义了一个叫做 newMessage 的订阅器,在客户端订阅该订阅器时,服务端将在有新消息时通过订阅器返回该消息的详细信息。

2. 实现 Resolver Function

接下来,我们需要实现 Resolver Function,用于处理客户端的查询和订阅请求,我们需要实现如下四种 Resolver Function:

  • Query resolver:用于处理客户端的普通查询请求;
  • Subscription resolver:用于在有新消息时,将消息详细信息推送给客户端;
  • Mutation resolver:用于处理客户端的修改请求,例如发送新的消息;
  • Resolver for Message type:用于定义 Message 类型的数据获取方式。

在本示例中,我们需要实现两个 Resolver Function:

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

以上代码中,我们定义了两个 Resolver Function,分别用于 Query 和 Subscription 类型:

  • Query 类型的 Resolver 函数 messages,将返回所有消息;
  • Subscription 类型的 Resolver 函数 newMessage,用于处理订阅请求,将返回在 NEW_MESSAGE_TOPIC 上注册的 resolver function。

3. 集成 pubsub

对于 Subscription resolver,我们需要使用 pubsub 来实现订阅功能,该功能需要与底层的 pubsub 库进行集成,以便可以在后端推送新的消息。

在本示例中,我们将使用 Node.js 的 Redis 库提供的 pubsub 库,实现订阅功能。以下是集成 pubsub 的代码实现:

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

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

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

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

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

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

以上代码实现了以下功能:

  • 通过 Redis 提供的 pubsub 库创建 pubsub 实例;
  • 定义订阅 Topic 名称 NEW_MESSAGE_TOPIC;
  • 在 Mutation resolver 中通过 pubsub 实例,将新消息发布到 NEW_MESSAGE_TOPIC 上;
  • 在 Mutation resolver 中定义 mutation 函数 sendMessage 用于发布新的消息。

4. 客户端订阅实例

最后,我们需要实现客户端的订阅功能,以便通过 Subscription 获取到服务端推送的消息。以下是客户端订阅的实现代码:

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

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

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

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

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

以上示例代码实现了如下功能:

  • 定义名为 NEW_MESSAGE_SUBSCRIPTION 的 GraphQL Subscription Query;
  • 使用 useSubscription Hook 订阅 NEW_MESSAGE_SUBSCRIPTION;
  • 定义 handleNewMessage 函数用于发送消息;
  • render 消息列表和发送消息的表单。

在客户端订阅 NEW_MESSAGE_SUBSCRIPTION Topic 后,当服务端有新消息时,客户端会立即收到推送消息,从而更新聊天记录。

结论

通过以上示例,我们可以看到 GraphQL Subscription 能够实现前端对后端数据的实时订阅,实现了推送式的数据更新,带来了更流畅、更实时的 Web 体验,同时也能减少无效数据交互和浪费的资源。以上示例也提供了一个实际项目的应用,对于进一步学习 GraphQL 技术和实现实时 Web 应用具有指导意义。

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


猜你喜欢

  • 如何使用 JavaScript 和 SSE 进行服务器推送?

    在 web 开发中,我们经常需要实现实时更新数据的功能,这需要服务器将数据推送到客户端,然后客户端根据数据更新页面。SSE(Server-Sent Events)就是一种实现服务器推送的技术,它是基于...

    9 天前
  • 如何使用Immutable.js优化Redux应用

    Redux是一种状态管理库,它提供了一种优雅的方式来管理应用程序中的数据流。Redux是如此广泛使用,以至于它成为了React开发者日常工作中的必备工具之一。虽然Redux在管理状态方面很牛,但在性能...

    9 天前
  • webpack 优化之 Tree-Shaking

    在现代化的前端开发过程中,Web 应用程序的整体规模越来越大,随之而来的是一系列的性能问题,其中最常见的是资源文件的加载速度慢和页面响应速度慢的问题。为了解决这些问题,并且为Web 应用程序带来更好的...

    9 天前
  • 关于 Web Components 中事件委托的最佳实践

    前言 Web Components 是一种前端组件化开发的方式,它能够将组件封装为独立的模块,从而提高代码可读性和复用率。随着 Web 开发越来越复杂,我们需要更好的方法来处理事件,避免事件冒泡和浏览...

    9 天前
  • 如何在 Deno 中使用 Koa 进行 Web 开发

    前言 Deno 是一个新的 JavaScript 运行时,由 Node.js 创始人 Ryan Dahl 开发。与 Node.js 不同的是,它没有使用 npm 包管理器,而是使用 ES 模块和 UR...

    9 天前
  • Node.js 错误处理的奇技淫巧

    在 Node.js 开发过程中,错误处理是非常重要的一个部分。代码出错或者运行异常可能会导致一些严重的问题,例如数据丢失,服务器宕机等。因此,对错误的处理需要考虑到各种情况,并且需要在正式上线前进行全...

    9 天前
  • Cypress 自动化测试技巧 - 解决元素定位问题

    Cypress 是一个流行的前端自动化测试框架,它提供了许多强大的工具和功能,可以使您的自动化测试过程更加简单和高效。其中一个主要挑战是在您的测试中定位元素。Cypress 提供了许多不同的方法来解决...

    9 天前
  • 在使用 SSE 时如何处理连接错误?

    Server-Sent Events (SSE) 是一种用于在 Web 应用程序中实现实时通信的技术。它通过 HTTP 连接向客户端发送消息,并支持在连接的整个生命周期内保持长期的连接。

    9 天前
  • 如何处理 MongoDB 导入的错误

    MongoDB 是一款非常流行的开源 NoSQL 数据库,被广泛应用于现代 Web 应用领域。在使用 MongoDB 进行数据导入时,有时候会发生一些错误,这些错误可能会影响到我们的数据库操作和数据的...

    9 天前
  • Flask-RESTful 中使用 Flask-JWT 实现认证和授权

    随着互联网的快速发展,Web 应用程序的需求不断增加。而这些应用程序经常涉及到用户身份验证和授权。为了提高应用的安全性和用户体验,开发人员需要使用一些带有安全性的工具。

    9 天前
  • ECMAScript 2016: 如何使用新的 catch 细节捕获语法?

    ECMAScript 2016: 如何使用新的 catch 细节捕获语法? 在 ECMAScript 2016 中,我们拥有了一个新的 catch 细节捕获语法,它可以更精确地捕获异常。

    9 天前
  • PM2 在 CentOS 上运行的问题解决

    PM2是一个流行的Node.js进程管理器,它可以在后台运行你的Node.js应用程序,并提供很多强大的功能,如自动重启、负载均衡和日志管理等。不过,有时候,在CentOS上运行PM2可能会遇到一些问...

    9 天前
  • webpack 实现自动化部署

    导言 随着前端技术的不断发展,前端项目的复杂度越来越高,很多项目需要进行打包、压缩、错误处理、自动化部署等操作。而在这些操作中,webpack 工具的作用越来越重要。

    9 天前
  • Redux 开发者工具的使用技巧

    前言 Redux 是一个非常流行的 JavaScript 应用程序状态管理库。它可以帮助我们更轻松地管理跨组件的状态,并且可以使状态的变化易于追踪和调试。Redux 还提供了一个开发者工具集,可以帮助...

    9 天前
  • 常见的 RxJS 错误及其解决方案

    RxJS 是一个非常强大的库,它为处理异步数据流提供了一种优雅和强大的解决方案。然而,随着使用的深入,经常遇到各种错误。在本文中,我们将介绍几种常见的 RxJS 错误及其解决方案。

    9 天前
  • Docker 容器启动失败 “OCI runtime create failed: container_linux.go:349” 问题的解决方法!

    在进行前端开发时,常常需要使用 Docker 容器。然而,在启动容器时,有可能会遇到 "OCI runtime create failed: container_linux.go:349" 这样的错误...

    9 天前
  • Redis 高可用性方案:Redis Sentinel

    概述 Redis 是一款快速、开源、高效的键值对存储数据库。但是,在真正的生产环境中,Redis 实例的高可用性必须得到保证。在 Redis 出现故障或宕机的情况下,需要找到一种解决方案来维护 Red...

    9 天前
  • 解析Kubernetes中的防抖动和容忍度

    本文将介绍Kubernetes中的防抖动和容忍度的概念以及其在实际生产中的应用。通过此文,你将深入了解到如何在Kubernetes集群中部署可靠、高效的应用,有效降低系统的错误率,提高应用的可用性和...

    9 天前
  • Node.js 开发框架之 Hapi 入门教程

    基本概念 什么是 Hapi? Hapi 是一个用于构建 Web 应用程序和服务的 Node.js 开发框架。它提供了一组强大的工具和库,使开发人员可以快速构建高质量的 Web 应用程序和 API。

    9 天前
  • JavaScript 如何更优雅地操作异步代码?—— 解析 ES9 中的异步迭代器

    在现代 web 开发中,异步编程已经成为了前端开发过程中不可避免的一部分,而 JavaScript 作为一门异步编程的语言,也需要不断地演进来更好地支持这种编程方式。

    9 天前

相关推荐

    暂无文章