实现 GraphQL Subscriptions:使用 Apollo Server 和 Subscriptions-Transport-Ws

阅读时长 8 分钟读完

GraphQL Subscriptions 是一种实时的数据交互方式,它用于在客户端和服务器之间建立长时间的连接,以便实现双向实时通信。这种方式适用于需要频繁更新数据的应用程序,例如聊天应用、实时博客等。

在本文中,我们将介绍如何使用 Apollo Server 和 Subscriptions-Transport-Ws 来实现 GraphQL Subscriptions,包括配置服务器和客户端,定义订阅和发布事件,以及实现实时交互功能。

安装和配置

为了使用 Apollo Server 和 Subscriptions-Transport-Ws,我们需要先安装这两个包:

接下来,我们将创建一个名为 server.js 的服务器文件,并添加以下代码:

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

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

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

在上述代码中,我们创建了一个 ApolloServer 实例并将其传递给 SubscriptionServer。我们还定义了一些 onConnect 和 onDisconnect 回调函数来处理客户端的连接和断开连接事件。

此外,我们还需要为服务器定义一个模式和解析器。这些应该存储在单独的文件中,例如 schema.jsresolvers.js。这里仅提供示例代码:

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

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

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

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

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

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

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

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

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

在这个模式中,我们定义了一个名为 postAdded 的订阅事件,用于在添加新帖子时更新客户端。每当添加新帖子时,服务器将触发订阅事件。

请注意,在 resolvers.js 文件中,我们导出了所有的解析器函数,以便通过服务器引入。

编写客户端

在服务器设置好后,我们可以创建一个简单的客户端来测试我们的 GraphQL Subscriptions 是否能正常工作。我们可以将其存储在名为 client.js 的文件中。这里的示例代码:

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

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

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

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

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

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

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

在上述代码中,我们将向服务器发起 WebSocket 连接,并定义一组 onConnected、onReconnected 和 onDisconnected 回调函数来处理连接和断开连接事件。

此外,我们还定义了一个名为 onPostUpdate 的订阅事件,用于订阅新帖子。每当服务器触发一个新的 postAdded 事件时,客户端将收到更新的数据。

运行

通过运行以下命令,我们可以将服务器和客户端连接到一起:

接下来,我们可以通过向服务器发送一个添加帖子的 graphql 查询来测试我们的订阅功能是否正常工作:

如上,我们添加了一个新帖子,服务器将触发 postAdded 事件并更新连接的所有订阅客户端。我们在客户端控制台中看到更新的数据。

总结

在本文中,我们介绍了如何使用 Apollo Server 和 Subscriptions-Transport-Ws 构建 GraphQL Subscriptions,其中包括服务器和客户端的设置和配置、事件订阅和发布的定义,以及一个简单的测试客户端。

GraphQL Subscriptions 使用起来很容易,并且可以使你的应用程序变得非常高效和实时。在实现一些实时数据更新的应用时,值得我们去学习和掌握。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f84b0df6b2d6eab3069a9d

纠错
反馈