在现代 Web 开发中,RESTful API 已经成为了很多应用程序构建的标准。RESTful 是一种面向资源的 API 设计风格,通过 HTTP 协议,对资源进行增删改查,让 Web 应用具备了更好的可伸缩性、可重用性和可靠性。
在本文中,我们将了解如何使用 Hapi 和 Sequelize.js 构建一个 RESTful 服务。Hapi 是一个 Node.js 的 Web 框架,提供了强大的路由、控制器和插件系统,能够轻松构建 API 服务。Sequelize.js 是一个优秀的 Object-Relational Mapping (ORM) 框架,能够让我们更方便地操作数据库。
准备工作
在开始构建 RESTful 服务之前,我们需要完成以下准备工作:
- 确保已经安装 Node.js,可以通过命令行输入
node -v
和npm -v
来检查 Node.js 和 npm 的版本。 - 在命令行中,使用
npm init
命令初始化一个新的 Node.js 项目。 - 在项目根目录下,使用
npm install --save hapi sequelize sequelize-cli pg
命令安装所需的依赖包。
其中,pg
是 PostgreSQL 数据库的驱动程序,如果你使用的是其他数据库,可以选择相应的驱动程序。
创建数据库模型
在使用 Sequelize.js 操作数据库之前,我们需要先定义模型。模型是用来表示数据库中的数据表,并提供了一些操作方法,例如创建、查找、更新和删除。
在本例中,我们定义了一个 Todo
模型,表示待办事项:
-- -------------------- ---- ------- -- -------------- -------------- - ----------- ---------- -- - ----- ---- - ------------------------ - ------ - ----- ----------------- ---------- ----- -- ---------- - ----- ------------------ ------------- ----- - --- ------ ----- --
在该模型中,我们定义了两个字段 title
和 completed
,分别表示待办事项的标题和是否已完成。同时,我们使用 sequelize.define
方法来创建了一个名为 Todo
的模型。
初始化数据库
在模型定义好之后,我们需要使用 Sequelize.js 来初始化数据库。Sequelize.js 提供了一个命令行工具 sequelize-cli
,可以帮助我们快速创建数据库和表,并生成一个配置文件 config/config.json
。
在命令行中,执行以下命令:
npx sequelize-cli init npx sequelize-cli model:generate --name Todo --attributes title:string,completed:boolean npx sequelize-cli db:migrate
其中,model:generate
命令用于生成一个名为 Todo
的模型,并添加 title
和 completed
两个属性;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 请求,请求体如下:
{ "title": "Learn JavaScript" }
服务器将会返回如下响应:
-- -------------------- ---- ------- - ------- - ----- -- -------- ------ ------------ ------------ ------ ------------ --------------------------- ------------ -------------------------- - -
同样的,向 http://localhost:3000/todos/1
发送 GET 请求,服务器将会返回单个待办事项的信息。
总结
在本文中,我们了解了如何使用 Hapi 和 Sequelize.js 构建一个 RESTful 服务。通过定义数据库模型、创建数据访问插件,并结合 Hapi 的路由和服务启动机制,我们可以快速构建出一个具有良好可扩展性和可重用性的 API 服务。
与此同时,Sequelize.js 的 ORM 特性和对 Postgres 等数据库的丰富支持,也让我们能够在处理数据库操作时更加高效便捷。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6476fed1968c7c53b03932b7