使用 Koa2+GraphQL 构建数据平台的实战教程

阅读时长 26 分钟读完

前言

随着互联网行业的飞速发展,前端技术日新月异,数据处理和管理也变得越来越庞大和复杂。为了更高效地处理数据和提高开发效率,我们采用 Koa2+GraphQL 的方式构建数据平台。

本教程将会详细介绍如何使用 Koa2+GraphQL 构建数据平台,包括环境搭建、GraphQL 的使用和实战案例。

环境搭建

安装 Node.js

首先需要在计算机上安装 Node.js。建议下载 LTS 版本,并根据所使用操作系统的不同,选择对应的版本进行下载和安装。

初始化项目

在命令行中进入所要创建的项目文件夹,执行以下命令:

然后我们可以通过以下命令来安装所需要的库:

  • koa:Koa2 框架;
  • koa-router:路由功能;
  • koa-bodyparser:解析请求体;
  • graphql:GraphQL 库;
  • graphql-tools:GraphQL 工具库;
  • apollo-server-koa:Apollo GraphQL 服务;
  • nodemon:自动重启 Node.js 应用

配置开发环境

可以在 package.json 中添加以下代码,配置项目的启动方式:

在这里,“start”表示运行所编写的应用程序,可以通过以下命令启动:

“build”表示将 ES6 代码编译为 ES5 代码,使其能够被浏览器/服务器兼容。

GraphQL 的使用

Schema

在 GraphQL 中,Schema 是指定义查询和数据类型的结构。

下面是一个简单的 Schema 示例:

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

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

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

在上述示例中,定义了一个 Query 类型,它只有一个字段,即 hello,它是一个字符串类型。

Resolver

Resolver 是指解析查询请求并返回请求的数据类型。

下面是一个 Resolver 示例:

在上述示例中,定义了一个 Query resolver,其返回值就是字符串“Hello World!”,用于响应查询 hello。

使用 Apollo Server

最后,在 app.js 中我们可以使用 Apollo Server 来启动 GraphQL 服务。

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

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

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

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

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

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

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

在上述示例中,我们实例化 Apollo Server 对象并将其传递给 app.use() 函数。然后通过 app.listen() 函数启动应用程序。

现在我们成功地使用 Koa2+GraphQL 构建了一个基本的 GraphQL 示例。接下来,我们将通过“构建数据平台”的实例来演示如何使用它。

构建数据平台

准备工作

我们将使用 MongoDB 来存储数据。因此,我们首先要安装 MongoDB:https://www.mongodb.com/try/download/community

初始化项目

初始化项目并安装所需要的库。

安装 Mongoose

数据模型

在 Models 目录下,我们创建 user.js 文件。

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

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

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

在上述示例中,我们定义了 userSchema 模型,其中包含了用户的姓名、电子邮件、密码和注册时间。

MongoDB 配置

在根目录下创建 config 文件夹并添加 db.js 文件。

将 <你的数据库名称> 替换为你的实际数据库名称。

使用 Mongoose 连接 MongoDB

在 app.js 中添加以下代码:

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

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

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

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

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

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

在上述示例中,我们使用 Mongoose 连接到 MongoDB 数据库,并使用数据库名称来配置连接字符串。一旦连接成功,我们将在控制台中看到“Connected to MongoDB”这一行输出。

GraphQL Resolvers 和 Mutations

在 graphql 目录下,我们将创建 resolvers.js 和 mutations.js 文件。

resolvers.js:

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

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

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

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

mutations.js:

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

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

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

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

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

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

在上述代码中,我们定义了一个 User 类型,该类型包括 id、name 和 email 字段。然后定义了创建和更新用户的最小字段,以及删除用户所需的 id 字段。

我们还定义了一个 mutations.js,其中包含了一个 Query 和三个 Mutation,以提供对用户的创建、更新和删除的完整支持。

编写前端代码

我们可以使用 React 和 Apollo Client 来编写前端代码。

在项目根目录下,运行以下命令:

然后,在 client/src/index.js 中,我们添加以下内容:

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

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

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

在上面的代码中,我们通过 Apollo Provider 提供 Apollo Client。

现在我们可以开始为每个页面编写组件。

首先是 Home 组件。在 client/src/components 目录下创建 Home.js 文件:

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

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

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

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

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

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

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

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

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

在上述代码中,我们使用 useQuery 钩子来获取用户列表,以及 useMutation 钩子来删除用户。

然后,我们需要创建添 加用户和编辑用户的页面。在 client/src/components 目录下,创建 AddUser.js 和 EditUser.js 文件。

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

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

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

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

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

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

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

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

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

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

在上述代码中,我们定义了一个表单组件来接收用户输入,然后将其传递给 createUser Mutation 进行保存。

注意:在 client/src/components/Form.css 文件中,添加以下代码来为表单创建样式:

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

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

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

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

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

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

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

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

接下来是 EditUser.js 组件。它的代码与 AddUser.js 组件大致相同,只是它在 componentDidMount 钩子中调用了 useQuery 钩子,并将查询结果填充到表格中以供编辑。

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

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

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

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

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

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

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

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

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

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

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

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

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

在 client/src/components 目录下,添加一个 Form.css 文件来为表单创建样式。。

启动应用程序

现在,我们已经创建了所有必需的组件和后端服务,我们可以在终端中运行以下命令来启动应用程序:

在浏览器中打开 http://localhost:3000。用户列表应该出现在该页上。点击“添加用户”链接并输入用户信息,然后单击“提交”按钮。如果一切正常,返回目录,将显示刚添加的用户。

接着,我们可以编辑用户信息。单击编辑链接,更改用户信息后,单击“提交”按钮即可保存更改。

最后,我们还可以单击“删除”按钮来删除用户。

结论

在本教程中,我们详细介绍了如何使用 Koa2+GraphQL 构建数据平台。我们学习了如何使用 Mongoose 连接 MongoDB 数据库,并使用 Apollo Server 和 Apollo Client 来构建前后端之间的交互。最后,我们提供了一个完整的实例,该实例使用了 React 和 Apollo Client 来展示和管理用户数据。

我们希望这篇文章可以帮助您更好地理解 GraphQL 和 Koa2,以及如何使用它们来构建数据驱动的 Web 应用程序。

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

纠错
反馈