使用 Prisma 和 GraphQL Yoga 构建 Next.js 应用程序

阅读时长 12 分钟读完

使用 Prisma 和 GraphQL Yoga 构建 Next.js 应用程序

随着前端技术的不断发展,前端工程师的工作范围也越来越广泛。而在这个领域中,使用 Prisma 和 GraphQL Yoga 构建 Next.js 应用程序已经成为一种趋势。

Prisma 是一个现代化的数据库工具,它提供了一种简单而强大的方式来管理数据库。它支持多种语言和数据库,并提供了许多高级功能,例如数据模型定义、数据迁移和类型安全的查询构建器。

GraphQL Yoga 是一个基于 Express 的 GraphQL 服务器框架,它提供了强大的开发工具和简单的API来构建 GraphQL API。它支持许多常见的功能,例如身份验证、订阅和缓存。

Next.js 是一个基于 React 的轻量级应用程序框架,它提供了一种简单的方式来构建静态和动态网站。它支持服务器端渲染和自动代码拆分,以提高性能和可维护性。

在本文中,我们将介绍如何使用 Prisma 和 GraphQL Yoga 构建 Next.js 应用程序。我们将从安装和配置开始,然后讨论如何定义数据模型、编写 GraphQL 查询和操作数据库。最后,我们将构建一个完整的示例应用程序,以演示如何将这些技术组合在一起。

安装和配置

在开始之前,您需要安装 Node.js 和 npm。您还需要一个支持的数据库(例如 MySQL、PostgreSQL 或 SQLite)和一个 Prisma 帐户。

首先,我们将创建一个新的 Next.js 应用程序:

然后,我们将安装 Prisma 和 GraphQL Yoga:

接下来,我们需要在项目根目录中创建一个 .env 文件,并将以下内容添加到其中:

请将 userpasswordmydatabase 替换为您的数据库凭据和数据库名称。

现在,我们可以开始配置 Prisma。首先,我们将使用 Prisma CLI 创建一个新的 Prisma 项目:

然后,我们需要定义数据模型。在 prisma/schema.prisma 文件中,我们将添加以下内容:

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

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

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

这个数据模型定义了一个 User 模型,它具有 idnameemailpassword 字段。我们还定义了一个名为 db 的数据源,它使用我们在 .env 文件中定义的数据库 URL。

现在,我们可以使用 Prisma CLI 来生成 Prisma 客户端:

这将生成一个名为 @prisma/client 的 npm 包,我们可以在代码中使用它来操作数据库。

定义 GraphQL API

接下来,我们将使用 GraphQL Yoga 来定义我们的 API。在 pages/api/graphql.js 文件中,我们将添加以下内容:

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

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

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

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

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

这个文件定义了一个 GraphQL 服务器,它包含一个名为 users 的查询和 createUserupdateUserdeleteUser 等操作。我们还定义了一个名为 user 的查询,它接受一个 id 参数并返回一个具有该 ID 的用户。这些操作都使用 Prisma 客户端来操作数据库。

我们还需要在 src/schema.graphql 文件中定义我们的 GraphQL 模式:

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

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

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

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

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

这个文件定义了我们的 GraphQL 模式,它包含一个名为 users 的查询和 createUserupdateUserdeleteUser 等操作。我们还定义了一个名为 user 的查询,它接受一个 id 参数并返回一个具有该 ID 的用户。这些操作都使用 Prisma 客户端来操作数据库。

构建示例应用程序

现在,我们可以构建一个完整的示例应用程序,以演示如何将这些技术组合在一起。

首先,我们将创建一个 pages/index.js 文件,它将包含我们的首页。我们将使用 React 和 Next.js 来构建一个简单的登录表单:

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

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

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

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

这个文件定义了一个名为 Home 的 React 组件,它包含一个简单的登录表单。我们使用 useState 钩子来管理表单字段,并使用 handleSubmit 函数来处理表单提交事件。

接下来,我们将创建一个名为 lib/prisma.js 的文件,它将包含我们的 Prisma 客户端实例:

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

--- ------

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

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

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

这个文件定义了一个名为 prisma 的单例对象,它使用 PrismaClient 类创建一个新的 Prisma 客户端。如果我们正在生产环境中运行代码,我们将创建一个新的 Prisma 客户端实例。否则,我们将使用全局变量来保存客户端实例,并在需要时重用它。

接下来,我们将创建一个名为 pages/api/login.js 的文件,它将处理我们的登录逻辑:

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

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

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

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

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

这个文件定义了一个名为 handler 的函数,它接受一个 reqres 对象,并根据请求方法来处理登录逻辑。如果请求方法为 POST,我们将从请求正文中提取 emailpassword 字段,并使用 Prisma 客户端来查找具有该电子邮件地址的用户。如果找不到用户或密码不正确,我们将返回一个 401 Unauthorized 响应。否则,我们将返回一个 200 OK 响应。

最后,我们将更新我们的 pages/index.js 文件,以使用 fetch API 来发送登录请求:

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

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

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

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

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

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

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

这个文件更新了我们的 handleSubmit 函数,以使用 fetch API 来发送登录请求。如果请求成功,我们将在控制台中打印一条消息。

结论

在本文中,我们介绍了如何使用 Prisma 和 GraphQL Yoga 构建 Next.js 应用程序。我们讨论了安装和配置、定义数据模型和 GraphQL API,以及构建一个完整的示例应用程序。这些技术的结合使得构建现代化的 Web 应用程序变得更加容易和高效。如果您正在寻找一种简单而强大的方式来管理数据库和构建 API,那么 Prisma 和 GraphQL Yoga 是一个非常不错的选择。

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

纠错
反馈