使用 GraphQL 和 Prisma 构建现代 Web 应用

阅读时长 11 分钟读完

引言

GraphQL 和 Prisma 是两个非常流行的现代 Web 开发技术。GraphQL 是一种用于 API 的查询语言和运行时环境,能让客户端发送一个描述性的查询请求,获得准确的数据。而 Prisma 是一个开源数据库工具,提供了简单易用的 ORM(对象关系映射) API,帮助开发者管理数据库并操作数据。

本文将会介绍如何使用 GraphQL 和 Prisma 构建现代 Web 应用。我们将首先深入了解 GraphQL 和 Prisma 的特性,然后使用示例代码来展示如何将二者相结合建立一个 Web 应用。

GraphQL

GraphQL 是一种用于 API 的查询语言和运行时环境,它能够减少前端和后端之间的通信,让前端能够准确地请求所需要的数据。它的工作原理是,客户端发送一个描述性的 GraphQL 查询请求给服务器,服务器返回一个 JSON 字符串作为响应,其中只包含客户端需要的数据。

相较于传统的 RESTful API,GraphQL 具有以下优点:

  • 精确的数据请求:客户端可以按需请求它所需要的具体数据,而非一整个 JSON 文档
  • 更少的网络通信:GraphQL 只会返回客户端需要的数据,减少了网络传输的负担
  • 模式强制:GraphQL 强制前后端之间的数据协议,防止出现数据不一致等问题

GraphQL 的语法非常简单易懂,以下是一个 GraphQL 查询示例:

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

在这个查询中,客户端请求了一个 id 为 1 的用户的 name 和 email 属性,以及该用户的所有帖子的 title 和 content 属性。

Prisma

Prisma 是一个现代化的 ORM(对象关系映射)框架,支持 TypeScript 和 JavaScript。它提供了一种简单的方法来与数据库进行交互,比传统的 ORM 更易于使用。

Prisma 的主要特点包括:

  • 简单的数据模型:Prisma 数据模型使用的是 GraphQL SDL(Schema Definition Language)语法,易于理解和编写
  • 兼容多种数据库:Prisma 可以与各种常见数据库进行交互,如 PostgreSQL、MySQL 和 MongoDB 等
  • 可扩展性:Prisma 的模块化框架使得它可以轻松进行扩展和定制

以下是一个使用 Prisma 配置数据库连接的示例:

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

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

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

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

在这个示例中,我们定义了一个名为 user 的对象,它包含了一个 email、一个 name 属性和一个 posts 嵌套属性。posts 属性又包含了一个 title 和一个 content 属性。我们使用上述对象创建一个新的用户,并在该用户下创建一篇名为 "Hello, World!" 的文章。

GraphQL 和 Prisma 的结合

现在我们已经了解了 GraphQL 和 Prisma 单独的特点,接下来我们来看看如何将两者结合起来创建一个现代化的 Web 应用。

第一步:创建 Prisma 数据模型

我们首先需要创建一个包含数据模型的 Prisma 项目。在该项目中,我们定义了如下 Model 数据模型:

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

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

该模型定义了两个实体,User 和 Post。一个 User 对象包含了 id、email、name 和一个 Post 数组。一个 Post 对象包含了 id、createdAt、updatedAt、title、content、published 和 author 等属性。

注意:实体之间存在一对多的关系。每个 Post 知道它属于哪个 User,因为它包含了一个名为 authorId 的属性。

第二步:编写 GraphQL 业务逻辑

我们需要编写一个 GraphQL API 来管理上述数据模型。以下是 API 的实现:

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

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

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

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

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

在这个 Schema 中,我们定义了两个 Object Type,User 和 Post,它们分别代表了 Prisma 中的两个实体。我们还定义了一个 Mutation 类型和一个 Query 类型,Mutation 类型含有多个函数用于创建、更新和删除资源。Query 类型则用于查询资源。

第三步:编写 Resolver

Resolver 是实现 GraphQL API 业务逻辑的函数。以下是 Resolver 的具体实现:

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

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

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

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

这段代码定义了每个字段的实现,如 getUser 对应了 prisma.user.findUnique 方法。注意,GraphQL 使用到了 Context,我们可以在 Context 里面传入 PrismaClient 的实例。在 resolvers 里我们可以解构出 Context 的 prisma 对象使用它来处理数据,这里的例子中我们使用 prisma.user 创建用户、prisma.post 创建文章、prisma.post.findMany 查询文章等。

第四步:集成 GraphQL Server & Prisma Client

我们需要将以上所有的实现组合起来,并在 GraphQL Server 启动时进行初始化。因此,我们需要一个文件来设置 GraphQL Server 和 PrismaClient。

以下是该文件的实现:

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

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

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

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

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

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

通过以上代码,我们可以编写一个简单的 Express.js Web 应用,该应用会使用步骤一中创建的 Prisma 数据模型和步骤二中定义的 GraphQL 的 API 接口。最后使用上述四部曲成功集成 Prisma 和 GraphQL 的 Server 代码示例完成。

总结

本文介绍了如何使用 GraphQL 和 Prisma 构建现代化的 Web 应用。我们首先了解了 GraphQL 和 Prisma 分别的特点,然后结合实例,深入理解了如何使用两者构建现代 Web 应用。这些有益的技术知识可以帮助开发者更快速地创建 Web 应用程序,减少了开发成本和时间,同时提高了 API 的质量和效率。

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

纠错
反馈