使用 GraphQL 构建实时聊天应用

阅读时长 11 分钟读完

本文将介绍如何使用 GraphQL 构建实时聊天应用。GraphQL 是一种新型的 API 查询语言,可以使前端应用可以更高效、更灵活地获取到所需的数据。实时聊天应用是一种典型的实时应用,通过 GraphQL 可以轻松实现。

技术概述

在本教程中,我们将使用以下技术来构建实时聊天应用:

  • GraphQL
  • Apollo Server
  • Apollo Client
  • React

准备工作

在开始构建前,请确保您已经安装好以下软件:

  • Node.js
  • npm

创建 GraphQL 服务器

我们将使用 Apollo Server 来创建一个 GraphQL 服务器。首先,创建一个新的项目并安装以下依赖项:

接下来,在项目根目录下创建一个 index.js 文件,在其中创建一个 ApolloServer 实例并定义一个 GraphQL schema。在 schema 中,我们定义了一个名为 Message 的类型,它包含 texttimestamp 两个字段:

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

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

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

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

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

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

resolvers 中,我们实现了一个名为 messages 的查询,它返回了两个硬编码的消息。现在启动服务器并访问 http://localhost:4000/graphql,您应该可以看到 GraphQL Playground 工具界面。

在 GraphQL Playground 中,您可以使用 messages 查询获取消息列表:

创建 React 应用

为了展示我们的实时聊天应用,我们将使用 React 创建一个简单的聊天界面。请在终端中输入以下命令:

现在我们将使用 create-react-app 创建了一个名为 client 的新项目,并在其中安装了必需的依赖项。接下来,我们将更新 src/index.js ,并在其中创建一个 ApolloClient 实例和一个用于显示消息和输入新消息的 React 组件:

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

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

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

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

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

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

在这里,我们使用 ApolloClient 类创建了一个 Apollo 客户端实例,并指定了 GraphQL 服务器的 URL。我们还将 Apollo Client 配置为包含一个名为 messages 的本地状态。

我们还向客户端添加了一个用于显示和输入消息的 React 组件,并将其包装在 ApolloProvider 中,以确保所有组件都可以访问客户端实例。

现在我们将在 src/App.js 文件中创建 Messages 组件。该组件将使用 GraphQL,从服务器获取消息并显示它们。此外,它还将包含一个输入字段,以便用户可以输入新消息并将其发送到服务器:

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

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

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

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

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

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

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

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

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

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

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

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

Messages 组件中,我们使用 Query 组件来从服务器获取消息。如果正在加载或发生错误,我们将显示相应的消息。否则,我们使用 map 方法遍历数据并将每个消息显示为一项列表,并附上时间戳。

为了让用户能够输入新消息,我们使用 Mutation 组件创建了一个名为 SEND_MESSAGE 的 GraphQL mutation。该组件接受一个名为 sendMessage 的回调函数,并在向服务器发送消息后将输入框重置为默认值。

我们还使用 Subscription 组件创建名为 MESSAGE_SENT 的 GraphQL 订阅,以便在服务器推送新消息时得到通知。这个组件使用回调函数处理新消息的显示逻辑。

实现实时聊天

现在,我们已经拥有了查询、修改和订阅 GraphQL API。我们可以在客户端和服务器之间通过 WebSockets 实现双向通信,从而创建实时聊天应用。我们将使用 subscriptions-transport-ws 让客户端连接到服务器的 WebSocket 端点。

打开 index.js 文件,在客户端实例中添加以下代码:

现在我们可以重新启动服务器和客户端,并启动多个客户端实例。每个客户端实例现在都可以向服务器发送消息并得到它们的实时更新。您可以通过 http://localhost:4000/graphql 查看服务器日志来验证这一点。

总结

我们已经学习了如何使用 GraphQL 和 Apollo 构建实时聊天应用。我们成功地使用了客户端和服务器之间的 WebSockets 通信,创建了一个实时的聊天应用。我们还介绍了许多 GraphQL 的概念,如查询、变异和订阅。希望这篇文章让您深入了解 GraphQL 并启发您在自己的项目中使用它的想法。

完整的示例代码可以在 GitHub 上找到。

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

纠错
反馈