如何使用 GraphQL 和 Prisma 构建实时聊天应用?

实时聊天应用是现代社交网络中不可或缺的一部分。随着互联网的普及和技术的进步,越来越多的人开始使用聊天应用来进行沟通和交流。在这篇文章中,我们将介绍如何使用 GraphQL 和 Prisma 构建一个实时聊天应用。

什么是 GraphQL?

GraphQL 是一种用于构建 API 的查询语言。它由 Facebook 在 2015 年开发,并于 2018 年开源。GraphQL 能够帮助我们更加高效地构建 API,并提供了强大的查询和类型系统。在 GraphQL 中,客户端可以指定需要的数据,并且只会返回它们所需的数据,这使得网络传输的数据量更小,并且可以提高应用的性能。

什么是 Prisma?

Prisma 是一个现代化的 ORM(Object-Relational Mapping)框架,它可以帮助我们更加高效地操作数据库。通过 Prisma,我们可以使用类型安全的 API 来查询和修改数据库中的数据。Prisma 支持多种数据库,包括 MySQL、PostgreSQL 和 MongoDB 等。

实时聊天应用的架构

在我们开始构建实时聊天应用之前,我们需要先了解一下它的架构。实时聊天应用通常由以下几个部分组成:

  1. 客户端:客户端是用户使用的应用程序。在实时聊天应用中,客户端通常是一个 Web 应用程序或移动应用程序。

  2. 服务器:服务器是处理客户端请求的应用程序。在实时聊天应用中,服务器通常使用 GraphQL 来实现 API。

  3. 数据库:数据库是存储聊天数据的地方。在实时聊天应用中,数据库通常使用 Prisma 来操作。

  4. 实时通信服务:实时通信服务是处理实时聊天的应用程序。在实时聊天应用中,实时通信服务通常使用 WebSocket 协议来实现实时通信。

下图展示了实时聊天应用的架构:

使用 GraphQL 和 Prisma 构建实时聊天应用

现在我们已经了解了实时聊天应用的架构,接下来我们将介绍如何使用 GraphQL 和 Prisma 构建一个实时聊天应用。

1. 安装 Prisma

首先,我们需要安装 Prisma。在终端中运行以下命令:

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

2. 配置 Prisma

接下来,我们需要配置 Prisma。在项目根目录中创建一个名为 prisma 的文件夹,并在其中创建一个名为 schema.prisma 的文件。在 schema.prisma 文件中,我们可以定义数据模型和数据库连接。

以下是一个示例 schema.prisma 文件:

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

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

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

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

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

上述 schema.prisma 文件中定义了三个数据模型:UserChatMessage。其中,User 模型表示聊天应用中的用户,Chat 模型表示聊天会话,Message 模型表示聊天消息。我们还定义了它们之间的关系,例如 Message 模型和 User 模型之间的 author 关系,以及 Message 模型和 Chat 模型之间的 chat 关系。

3. 生成 Prisma Client

接下来,我们需要生成 Prisma Client。在终端中运行以下命令:

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

这将生成一个名为 prisma-client-js 的文件夹,其中包含了我们定义的数据模型的类型安全的 API。

4. 实现 GraphQL API

现在我们已经准备好了 Prisma,接下来我们需要实现 GraphQL API。在项目中,我们可以使用 Apollo Server 来实现 GraphQL API。

首先,我们需要安装 Apollo Server。在终端中运行以下命令:

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

接下来,在项目中创建一个名为 server.js 的文件,并添加以下代码:

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

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

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

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

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

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

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

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

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

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

上述代码中,我们定义了三个查询类型:userschatsmessages,以及三个变更类型:createUsercreateChatcreateMessage。我们还定义了数据模型的 GraphQL 类型,并实现了它们的解析器函数。

5. 实现实时通信服务

最后,我们需要实现实时通信服务。在项目中,我们可以使用 WebSocket 和 subscriptions-transport-ws 库来实现实时通信服务。

首先,我们需要安装 subscriptions-transport-ws 库。在终端中运行以下命令:

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

接下来,在 server.js 文件中添加以下代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

上述代码中,我们定义了一个名为 messageAdded 的订阅类型,并实现了它的订阅器函数。我们还使用 pubsub 实现了消息添加时的实时推送功能。最后,我们使用 SubscriptionServer 创建了一个 WebSocket 服务器,并将其连接到 Apollo Server 中。

6. 使用实时聊天应用

现在,我们已经完成了实时聊天应用的构建。我们可以使用 GraphQL Playground 或其他客户端工具来测试我们的应用程序。

在 GraphQL Playground 中,我们可以使用以下查询来获取所有用户:

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

我们可以使用以下变更来创建一个新用户:

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

我们可以使用以下查询来获取所有聊天:

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

我们可以使用以下变更来创建一个新聊天:

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

我们可以使用以下查询来获取所有消息:

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

我们可以使用以下变更来创建一个新消息:

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

最后,我们可以使用以下订阅来订阅 messageAdded 事件:

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

当有新的消息添加到聊天室时,我们将收到实时推送。

总结

在本文中,我们介绍了如何使用 GraphQL 和 Prisma 构建实时聊天应用。我们了解了实时聊天应用的架构,并学习了如何使用 Prisma、Apollo Server 和 WebSocket 来实现它。我们还提供了示例代码来帮助您更好地理解如何实现这些功能。希望这篇文章能够对您有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66301fb8d3423812e4e124b4