如何在 GraphQL 应用中使用 Subscriptions

阅读时长 8 分钟读完

GraphQL 是一种用于构建 API 的查询语言,它可以通过单个请求获取多个资源,并且可以根据客户端的需求灵活地返回数据。在 GraphQL 应用中,Subscriptions 是一种强大的实时数据推送机制,可以让客户端实时获取数据更新,而不必轮询服务器。

在本文中,我们将介绍如何在 GraphQL 应用中使用 Subscriptions,包括如何定义和使用 Subscriptions,以及如何在客户端和服务器端实现实时数据推送。

Subscriptions 的定义和使用

Subscriptions 是一种 GraphQL 查询类型,它允许客户端订阅服务器端的实时数据更新。与查询和变异不同,Subscriptions 是一种持久连接,可以在客户端和服务器端之间保持打开状态,以便在数据更新时立即推送数据。

定义 Subscriptions 的语法与定义查询和变异的语法类似,例如:

这个 Subscriptions 查询将订阅服务器端的 newPost 事件,并在每次新的帖子发布时返回帖子的 idtitlecontent

在客户端中,可以使用 subscribe 函数来订阅 Subscriptions,例如:

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

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

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

在这个示例中,我们使用 gql 函数定义了 Subscriptions 查询,并使用 client.subscribe 函数订阅了这个查询。然后,我们使用 observer.subscribe 函数来监听数据更新,并在每次更新时打印数据到控制台。

实现实时数据推送

在 GraphQL 应用中,实现实时数据推送需要在服务器端和客户端之间建立 WebSocket 连接,并在数据更新时使用 WebSocket 推送数据。

在服务器端,可以使用 GraphQL Subscriptions 库来实现 Subscriptions 功能。例如,以下是一个使用 GraphQL Subscriptions 实现实时数据推送的示例:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个示例中,我们使用 PubSub 类来创建一个实例,然后定义了一个 NEW_POST 常量来表示新帖子事件。然后,我们定义了一个 Subscription 类型的 Subscriptions,它将订阅 newPost 事件,并在每次新的帖子发布时返回帖子对象。在 Mutation 类型的 createPost 操作中,我们在发布新帖子时使用 pubsub.publish 函数将数据推送到客户端。

在客户端中,我们需要使用 WebSocket 来建立连接,并在数据更新时使用 WebSocket 推送数据。以下是一个使用 Apollo Client 和 WebSocket 实现实时数据推送的示例:

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

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

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

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

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

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

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

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

在这个示例中,我们使用 WebSocketLink 类创建一个 WebSocket 连接,然后使用 split 函数将 HTTP 和 WebSocket 连接分离。在订阅 Subscriptions 时,我们使用 client.subscribe 函数订阅 Subscriptions 查询,并在每次更新时打印数据到控制台。

总结

在本文中,我们介绍了如何在 GraphQL 应用中使用 Subscriptions,包括如何定义和使用 Subscriptions,以及如何在客户端和服务器端实现实时数据推送。通过使用 Subscriptions,我们可以让客户端实时获取数据更新,提高应用的实时性和用户体验。

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

纠错
反馈