在现代化的 Web 开发中,REST API 已经成为了开发者们的标准实践。在 Node.js 生态系统中,有数不尽的轻量级 Web 框架可供选择,其中 Fastify 就是一个快速、低开销而且安全的框架。而 Sequelize ORM 则提供易于使用的数据访问层,可以帮助我们轻松地映射关系型数据库。在本文中,我们将探讨如何使用 Fastify 和 Sequelize ORM 来重构 REST API,并给出示例代码。
快速入门
前置条件
在开始本文之前,您需要先安装以下工具:
- Node.js (版本 >= 12.0.0)
- MySQL 数据库 (或其它支持 Sequelize 的关系型数据库)
安装 Fastify 和 Sequelize
我们可以使用 npm 来安装最新版本的 Fastify 和 Sequelize。在您的项目根目录中运行以下命令:
npm install fastify sequelize
创建一个 Fastify 应用
在您的项目中引入 Fastify 并创建一个实例:
const fastify = require('fastify')();
配置 Sequelize
在使用 Sequelize 之前,我们需要先连接到数据库并设置一些基本的配置:
-- -------------------- ---- ------- ----- - --------- - - --------------------- ----- --------- - --- ----------- -------- --------- -------- ----------- ------- - ----------- ------ -- ---
在上面的代码中,我们创建了一个 SQLite 数据库实例,并禁用了 Sequelize 自带的时间戳功能。
创建模型
现在,我们可以创建一个模型,并定义其属性和关系。例如,我们可以创建一个名为 User
的模型:
-- -------------------- ---- ------- ----- - ------ --------- - - --------------------- ----- ---- ------- ----- -- ----------- ---------- - ----- ----------------- ---------- ------ -- --------- - ----- ----------------- ---------- ------ -- ------ - ----- ----------------- ---------- ------ ------- ----- -- --------- - ----- ----------------- ---------- ------ -- -- - ---------- ---------- ------- ---
上述模型定义了一个 User
对象,包含了 firstName
、lastName
、email
和 password
等四个属性。
创建路由
现在,我们可以创建一个路由,并绑定到 Fastify 应用上:
-- -------------------- ---- ------- --------------------- ----- ----- ------ -- - ----- ----- - ----- --------------- ------------------ --- ---------------------- ----- ----- ------ -- - ----- - ---------- --------- ------ -------- - - --------- ----- ---- - ----- ------------- ---------- --------- ------ -------- --- ----------------- --- ------------------------- ----- ----- ------ -- - ----- ---- - ----- ----------------------------- ----------------- --- ------------------------- ----- ----- ------ -- - ----- - ---------- --------- ------ -------- - - --------- ----- ---- - ----- ------------- ---------- --------- ------ -------- -- - ------ - --- ------------- -- --- ----------------- --- ---------------------------- ----- ----- ------ -- - ----- -------------- ------ - --- ------------- - --- ------------- ---
上述代码定义了一些路由,包括获取所有用户列表、创建用户、获取单个用户、更新用户和删除用户。
启动应用
最后,我们需要启动 Fastify 应用:
fastify.listen(3000, (err, address) => { if (err) { console.error(err); process.exit(1); } console.log(`Server listening at ${address}`); });
深入剖析
配置 Sequelize
在前面的快速入门中,我们讲解了如何创建一个 Sequelize 实例,并连接到 SQLite 数据库。但是,在实际使用中,我们需要配置一些更加详细的选项。
定义模型
在 Sequelize 中,模型是代表数据库表的类。在创建模型时,我们需要定义其属性和关系。例如,下面的代码定义了一个 Task
模型:
-- -------------------- ---- ------- ----- - ------ --------- - - --------------------- ----- ---- ------- ----- -- ----------- ------ - ----- ----------------- ---------- ------ -- ------------ - ----- --------------- ---------- ----- -- -- - ---------- ---------- ------- ---
在上面的代码中,我们创建了一个名为 Task
的模型,包含了 title
和 description
两个属性。在创建属性时,我们可以根据具体的需要设置其类型、是否允许为 null、是否唯一,以及其它的一些属性。
在定义完模型之后,我们可以使用 Sequelize 自带的 Model 和 DataTypes 进行操作。
定义关联
除了定义属性,我们还可以在模型间定义关联。比如,我们可以定义一个 Task
模型,它关联了一个 User
模型:
-- -------------------- ---- ------- ----- ---- ------- ----- -- ----------- ------ - ----- ----------------- ---------- ------ -- ------------ - ----- --------------- ---------- ----- -- -- - ---------- ---------- ------- --- ----- ---- ------- ----- -- ----------- ----- - ----- ----------------- ---------- ------ -- -- - ---------- ---------- ------- --- -------------------- - --------- --------- --- -------------------
在上面的代码中,我们创建了两个模型,User
和 Task
。并在 Task
模型中定义了一个 belongsTo
关联,表示一个 Task 属于一个 User,同时在 User
模型中定义了一个 hasMany
关联,表示一个 User 拥有多个 Task。
定义数据验证
Sequelize 提供了丰富的数据验证功能,可以帮助我们在插入或更新数据时进行合法性验证。例如,我们可以在 User
模型中定义一些验证规则:
-- -------------------- ---- ------- ----- - ------ ---------- --------- - - --------------------- ----- ---- ------- ----- -- ----------- ---------- - ----- ----------------- ---------- ------ --------- - --------- ----- -------- ----- ---- --- ---- -- -- --------- - ----- ----------------- ---------- ------ --------- - --------- ----- -------- ----- ---- --- ---- -- -- ------ - ----- ----------------- ---------- ------ ------- ----- --------- - -------- ----- -- -- --------- - ----- ----------------- ---------- ------ --------- - ---- --- ---- -- -- -- - ---------- ---------- ------- ---
在上面的代码中,我们使用了一些常见的数据验证规则,包括 notEmpty
、notNull
、len
和 isEmail
等。您可以根据具体的需求自定义数据验证规则。
创建路由
在前面的快速入门中,我们展示了创建路由的示例。在实际应用中,我们需要根据具体业务场景进行路由定义。
参数获取
Fastify 提供了多种方式来获取传入的请求参数,包括查询参数、请求体、路径参数等。
获取路径参数,可以使用 req.params
:
fastify.get('/:id', async (req, reply) => { const { id } = req.params; const user = await User.findByPk(id); reply.send(user); });
获取查询参数,可以使用 req.query
:
fastify.get('/', async (req, reply) => { const { limit, offset } = req.query; const users = await User.findAll({ limit, offset }); reply.send(users); });
获取请求体,可以使用 req.body
:
fastify.post('/', async (req, reply) => { const { firstName, lastName, email, password } = req.body; const user = await User.create({ firstName, lastName, email, password }); reply.send(user); });
错误处理
在 REST API 中,异常情况下需要返回有意义的错误信息。在 Fastify 中,我们可以使用 fastify-error
插件来处理错误。例如:
-- -------------------- ---- ------- ----------------- ----- ----- ------ -- - --- - ----- - ---------- --------- ------ -------- - - --------- ----- ---- - ----- ------------- ---------- --------- ------ -------- --- ----------------- - ----- ----- - ----- --- ------------- -- ------ ------- - ---
在上面的代码中,我们使用了 try
/catch
来捕获异常,在出现异常时抛出错误信息,而不是让客户端收到 HTTP 500 错误。
启动应用
Fastify 支持多种启动方式,包括 HTTP、HTTPS、Unix 套接字、HTTP2 和多端口监听等。在启动应用时,我们可以指定监听的主机和端口。例如:
fastify.listen(3000, '0.0.0.0', (err) => { if (err) { console.error(err); process.exit(1); } console.log('Server started'); });
在上面的代码中,我们将应用运行在 0.0.0.0:3000
地址上。
完整示例
在本文中,我们讲解了如何使用 Fastify 和 Sequelize ORM 来构建 REST API,下面是一份完整的示例代码:
-- -------------------- ---- ------- ----- ------- - --------------------- ----- - ---------- ------ --------- - - --------------------- ----- --------- - --- ----------- -------- --------- -------- ----------- ------- - ----------- ------ -- --- ----- ---- ------- ----- -- ----------- ---------- - ----- ----------------- ---------- ------ -- --------- - ----- ----------------- ---------- ------ -- ------ - ----- ----------------- ---------- ------ ------- ----- -- --------- - ----- ----------------- ---------- ------ -- -- - ---------- ---------- ------- --- --------------------- ----- ----- ------ -- - ----- ----- - ----- --------------- ------------------ --- ---------------------- ----- ----- ------ -- - ----- - ---------- --------- ------ -------- - - --------- ----- ---- - ----- ------------- ---------- --------- ------ -------- --- ----------------- --- ------------------------- ----- ----- ------ -- - ----- ---- - ----- ----------------------------- ----------------- --- ------------------------- ----- ----- ------ -- - ----- - ---------- --------- ------ -------- - - --------- ----- ---- - ----- ------------- ---------- --------- ------ -------- -- - ------ - --- ------------- -- --- ----------------- --- ---------------------------- ----- ----- ------ -- - ----- -------------- ------ - --- ------------- - --- ------------- --- -------------------- ---------- ----- -- - -- ----- - ------------------- ---------------- - ------------------- ---------- ---
总结
在本文中,我们探讨了如何使用 Fastify 和 Sequelize ORM 来构建 REST API。Fastify 是一个快速、低开销而且安全的框架,而 Sequelize 提供了易于使用的数据访问层。在实际应用中,我们需要根据具体业务场景来定义数据模型和路由,并灵活地使用 Fastify 和 Sequelize 提供的功能,以实现高效的 Web 开发。
本文涉及的完整示例代码可以在 https://github.com/wxyyxc1992/Backend-Series-With-NodeJS 进行查看,并提工程的方式进行运行测试。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648f822448841e9894dbcac6