使用 Hapi 与 MongoDB 构建强大的 RESTful API

RESTful API 是现代 Web 开发中的基础。Hapi 是一个流行的 Node.js Web 框架,它提供了强大的路由、插件和错误处理等特性。MongoDB 是一个开源 NoSQL 数据库,它使用 JSON 格式存储文档。在本文章中,我们将学习如何使用 Hapi 与 MongoDB 构建一个强大的 RESTful API。

准备工作

在开始构建 RESTful API 之前,我们需要确保已经安装了 Node.js 和 MongoDB。如果您还没有安装它们,请先安装。在安装 Node.js 时,Node 包管理器(npm)也会自动安装。MongoDB 是一个独立的 NoSQL 数据库,需要自行从官网下载。

我们将使用 Hapi、Mongoose(为 MongoDB 提供的 Node.js ORM)和 Joi(Hapi 插件,用于验证请求数据)这些库。您可以通过 npm 进行安装:

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

设计数据模型

设计良好的数据模型是构建 RESTful API 的基础。在本教程中,我们将构建一个 TODO 应用程序,该程序将使用以下两个 MongoDB 集合:

  • todos:包含待办事项和每个待办事项的详细信息,如标题、描述、截止日期等。
  • users:包含应用程序用户的详细信息,如姓名、电子邮件地址和密码。

为了定义这些模型,我们使用 Mongoose。以下是 todos 数据模型的定义:

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

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

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

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

类似地,以下是 users 数据模型的定义:

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

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

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

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

在这里,我们定义了两个 Mongoose 模型:Todo 和 User。Todo 模型包含 title、description、created_at、deadline、completed 和 user_id 属性。User 模型包含 name、email 和 password 属性。我们使用 ref 属性指向 User 模型,以便在需要时轻松地获取用户信息。

创建 Hapi 服务器

在我们开始编写路由之前,我们需要创建 Hapi 服务器。以下是服务器的设置代码:

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

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

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

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

--------

在这里,我们首先连接到了 MongoDB 数据库,然后创建了一个新的 Hapi 服务器实例。我们指定了服务器的主机名和端口,并在 start() 函数中启动服务器。

编写路由

现在我们已经有了服务器,我们可以开始编写路由来处理 HTTP 请求。在本教程中,我们将定义以下路由:

  • GET /todos:获取所有待办事项。
  • GET /todos/{id}:获取指定 ID 的待办事项。
  • POST /todos:创建新的待办事项。
  • PUT /todos/{id}:更新指定 ID 的待办事项。
  • DELETE /todos/{id}:删除指定 ID 的待办事项。
  • POST /users:创建新的用户。
  • POST /login:用户登录。

以下是我们的路由定义:

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

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

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

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

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

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

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

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

在这里,我们定义了各种路由,无论是获取、创建、更新还是删除 TODO,或是创建用户或进行登录。我们还使用了 Joi 插件来验证用户数据,使用 Mongoose 在 MongoDB 中查询并操作数据。我们还使用了 Boom 插件来返回适当的 HTTP 错误响应。

结论

现在您已经了解了如何使用 Hapi 和 MongoDB 构建一个强大的 RESTful API。我们在本教程中学习了许多关于 Hapi、Mongoose、Joi 和 MongoDB 的知识,并知道了如何构建路由来处理 HTTP 请求。我希望这篇文章对您有所帮助,并能让您在构建 Web 应用程序时大显身手!

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