如何编写带有实时功能的 GraphQL API

阅读时长 6 分钟读完

GraphQL 是一种新兴的 API 开发语言,它为前端开发者提供了更高效、更精细的数据查询和管理方式。与传统 RESTful API 不同,GraphQL 可以根据客户端的需求动态生成返回结果,使得 API 对前端的适配更加灵活、实用。

除此之外,GraphQL 还提供了实时数据更新的功能,这使得我们可以在服务端推送数据变化,从而实现实时更新的效果。本文将介绍如何编写带有实时功能的 GraphQL API,内容详细、有深度和学习以及指导意义。

第一步:引用相关库和包

我们首先需要引用一些必要的库和包,来确保我们能够正常开始我们的 GraphQL API 编写:

这里的 express 是一个 Node.js 的 Web 框架,用于构建 HTTP 服务器。ApolloServer 则是 Apollo 公司开发的一个用于构建 GraphQL API 的库。http 则是用于封装 WebSocket 的 Node.js 标准库。pubsub 是我们自己编写的用于发布/订阅的库。

第二步:配置 ApolloServer

在配置 ApolloServer 之前,我们需要先定义 GraphQL 的 schema。这里我们将定义一个简单的 schema,包含一个用于获取当前时间的 Query 和一个用于实时更新时间的 Subscription:

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

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

在上述 schema 中,我们定义了一个 Query 类型,包含一个 now 字段,用于获取当前时间。同时我们还定义了一个 Subscription 类型,包含一个 clock 字段,用于实时更新时间。

接下来,我们需要实现这个 schema 的 resolvers。这里我们将通过 setInterval 来每秒推送一次新的时间戳:

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

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

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

在上述代码中,我们首先实现了 Query 中的 now 字段,它简单地返回当前时间的 ISO 字符串。接下来我们回到 Subscription 中,在 subscribe 函数中使用 pubsub.asyncIterator 来创建一个用于订阅的迭代器,我们就可以通过这个迭代器实现实时推送数据。

最后一行代码使用 setInterval 来每秒钟推送一次新的时间戳,这样我们就可以在前端实时更新数据了。

第三步:配置 WebSocket

我们已经成功创建了一个带有实时功能的 GraphQL API,但是我们需要使用 WebSocket 来确保能够实时更新数据。

在 Express 中使用 WebSocket 技术需要使用 ws 包,它可以帮助我们创建 WebSocket 服务。这里我们需要在 Express 中使用 http 来创建我们的 HTTP 服务器,并且使用 ws 包来创建我们的 WebSocket 服务:

接下来我们需要将我们的 WebSocket 服务绑定到 ApolloServer 的 executeOperation 函数,这样我们就可以在 WebSocket 中推送数据了:

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

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

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

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

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

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

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

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

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

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

在上述代码中,onConnectonDisconnect 分别是在 WebSocket 和前后端建立连接和断开连接时会执行的回调函数。我们在 executeOperation 函数中对于 clock 操作进行了特殊处理,用于实现实时推送数据,对于其他 Query 和 Mutation 操作则继续使用 Apollo 的默认执行函数 execute

最后,我们将 ws.handleUpgrade 绑定到 ApolloServer 的 subscribe 函数上,这样我们就可以使用 WebSocket 来实现实时数据的推送和更新了。

总结

本文介绍了如何编写带有实时功能的 GraphQL API。我们首先需要引用相关库和包,然后定义 schema 和实现 resolvers,接着配置 WebSocket,最后就可以实现实时数据的推送和更新。这种实时功能可以应用于聊天室、在线游戏等多种应用场景,是前端开发中不可或缺的一项技术。

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

纠错
反馈