使用 Hapi 和 Sequelize.js 构建 RESTful 服务

阅读时长 10 分钟读完

在现代 Web 开发中,RESTful API 已经成为了很多应用程序构建的标准。RESTful 是一种面向资源的 API 设计风格,通过 HTTP 协议,对资源进行增删改查,让 Web 应用具备了更好的可伸缩性、可重用性和可靠性。

在本文中,我们将了解如何使用 Hapi 和 Sequelize.js 构建一个 RESTful 服务。Hapi 是一个 Node.js 的 Web 框架,提供了强大的路由、控制器和插件系统,能够轻松构建 API 服务。Sequelize.js 是一个优秀的 Object-Relational Mapping (ORM) 框架,能够让我们更方便地操作数据库。

准备工作

在开始构建 RESTful 服务之前,我们需要完成以下准备工作:

  1. 确保已经安装 Node.js,可以通过命令行输入 node -vnpm -v 来检查 Node.js 和 npm 的版本。
  2. 在命令行中,使用 npm init 命令初始化一个新的 Node.js 项目。
  3. 在项目根目录下,使用 npm install --save hapi sequelize sequelize-cli pg 命令安装所需的依赖包。

其中,pg 是 PostgreSQL 数据库的驱动程序,如果你使用的是其他数据库,可以选择相应的驱动程序。

创建数据库模型

在使用 Sequelize.js 操作数据库之前,我们需要先定义模型。模型是用来表示数据库中的数据表,并提供了一些操作方法,例如创建、查找、更新和删除。

在本例中,我们定义了一个 Todo 模型,表示待办事项:

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

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

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

在该模型中,我们定义了两个字段 titlecompleted,分别表示待办事项的标题和是否已完成。同时,我们使用 sequelize.define 方法来创建了一个名为 Todo 的模型。

初始化数据库

在模型定义好之后,我们需要使用 Sequelize.js 来初始化数据库。Sequelize.js 提供了一个命令行工具 sequelize-cli,可以帮助我们快速创建数据库和表,并生成一个配置文件 config/config.json

在命令行中,执行以下命令:

其中,model:generate 命令用于生成一个名为 Todo 的模型,并添加 titlecompleted 两个属性;db:migrate 命令用于把模型转化为数据库表。

经过以上步骤后,我们创建的数据库模型将会自动映射到名为 todos 的数据表中。

编写数据访问层

在 Hapi 中,数据访问层可以通过插件来实现。我们可以把所有的数据操作都封装到一个插件中,然后在路由中调用这个插件来实现数据访问。

以下是一个名为 todo-plugin.js 的数据访问插件,提供了增删改查等操作:

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

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

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

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

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

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

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

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

在插件中,我们使用了 options 参数来传递一个包含 Todo 模型的对象。在路由处理函数中,我们使用 Sequelize.js 提供的方法来操作数据库,如果出现异常,可以使用 Boom 模块抛出错误信息。

注册插件和启动服务器

最后,我们可以在项目的入口文件中注册插件和启动服务器:

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

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

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

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

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

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

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

-------

在服务器启动之前,我们首先需要使用 Sequelize.js 来验证数据库连接。然后,我们使用 server.register 方法注册插件,并把包含 Todo 模型的对象传递给插件。最后,我们调用 server.start 方法启动服务器。

测试 API

在服务器启动后,我们可以使用 Postman 或其他 HTTP 工具来测试 API。

  • GET /todos:获取所有待办事项
  • GET /todos/{id}:获取单个待办事项
  • POST /todos:创建待办事项
  • PUT /todos/{id}:更新待办事项
  • DELETE /todos/{id}:删除待办事项

例如,在 Postman 中,向 http://localhost:3000/todos 发送 POST 请求,请求体如下:

服务器将会返回如下响应:

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

同样的,向 http://localhost:3000/todos/1 发送 GET 请求,服务器将会返回单个待办事项的信息。

总结

在本文中,我们了解了如何使用 Hapi 和 Sequelize.js 构建一个 RESTful 服务。通过定义数据库模型、创建数据访问插件,并结合 Hapi 的路由和服务启动机制,我们可以快速构建出一个具有良好可扩展性和可重用性的 API 服务。

与此同时,Sequelize.js 的 ORM 特性和对 Postgres 等数据库的丰富支持,也让我们能够在处理数据库操作时更加高效便捷。

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

纠错
反馈