Mongoose 是 Node.js 中一个优秀的 MongoDB 连接库,它提供了众多的工具和 API,帮助开发者更高效地操作 MongoDB 数据库。在 Mongoose 中,Schema 是一个重要的概念,通过它可以定义数据模型的规则、默认值、类型等信息。而 Schema 钩子函数又是在操作保存、更新等行为中起到很重要作用的一种机制。本文将详细介绍 Mongoose 中的 Schema 钩子函数的使用方法以及常见的使用场景。
Schema 钩子函数
在 Mongoose 中,Schema 钩子函数是通过调用 pre 和 post 方法注册的。在这些方法中,第一个参数是中间件的名称,第二个参数是中间件函数,这个函数在执行之前或之后将被调用。Schema 钩子函数可以用于多种场景,例如在保存或删除文档之前或之后执行某个操作等。
pre 与 post
pre 和 post 是 Mongoose 钩子函数的两种类型。pre 钩子函数在执行操作之前执行,而 post 钩子函数则在执行完操作之后执行。这两种钩子函数的参数和返回值不同。
例如,pre 钩子函数通常会接收一个 next 回调函数,它可以在执行完当前操作后调用。而 post 钩子函数通常将操作结果作为参数传递给它的回调函数。
中间件执行流程
在执行中间件函数时,Mongoose 遵循下列的执行顺序:
- 执行串行钩子函数中的第一个中间件函数
- 执行该中间件函数的 next 方法,让下一个中间件函数继续执行
- 重复执行以上两个步骤,直到串行钩子函数中的所有中间件函数都执行完毕
- Mongoose 执行并行钩子函数中的所有中间件函数,中间件之间没有执行顺序限制
常见使用场景
下面是一些常见使用场景,它们可以帮助 Mongoose 开发者更好地利用钩子函数来加快开发效率。
自动时间戳
在 MongoDB 中,我们可以使用 $currentDate 作为更新操作的值来实现自动时间戳的效果。而在 Mongoose 中,我们可以使用 Schema 钩子函数来实现同样的效果。
-- -------------------- ---- -------
----- -------- - --------------------
----- ------ - --- -----------------
----- -------
---------- -----
---------- ----
---
-- ------------- --------- - --------- ----
------------------ -------------- -
----- --- - --- -------
-- ----------------- -
-------------- - ----
-
-------------- - ----
-------
---在这个例子中,我们定义了一个 schema,包含了 name、createdAt 和 updatedAt 三个字段。然后我们通过 pre 方法注册了一个更新前的钩子函数,这个函数会自动更新 createdAt 和 updatedAt 字段的值并在保存文档之前执行。这样,代码中就不用再手动更新这些字段的值了。
加密密码
在实际开发中,用户的密码通常需要加密后保存。可以使用 Schema 钩子函数来实现这个需求。
-- -------------------- ---- -------
----- -------- - --------------------
----- ------ - ------------------
----- ---------- - ---
----- ------ - --- -----------------
--------- -------
--------- ------
---
-- ------------------
------------------ -------------- -
----- ---- - -----
-- -------------------
-- ------------------------------ -
------ -------
-
-------------------------- ------------- ----- -
-- ----- -
------ ----------
-
-------------------------- ----- ------------- ----- -
-- ----- -
------ ----------
-
------------- - -----
-------
---
---
---在这个例子中,我们定义了一个 schema,包含了 username 和 password 两个字段。然后我们通过 pre 方法注册了一个保存前的钩子函数,这个函数会对密码进行加密,使用 bcrypt 进行哈希处理,加密后的密码会替换原来的密码。这样,保存到数据库的密码就是经过加密处理的了。
发送邮件
在某些情况下,我们需要在保存或删除数据后,自动发送一封邮件通知相关人员。可以使用 nodemailer 库来实现这个需求。
-- -------------------- ---- -------
----- -------- - --------------------
----- ---------- - ----------------------
----- ------ - --- -----------------
----- -------
------ ------
---
-- -----------------
------------------- ------------- -
----- ----------- - ----------------------------
-------- --------
----- -
----- ------ ----- ----- ----------
----- ------ ----- ----------
-
---
----- ----------- - -
----- ------ ----- ----- ----------
--- ----------
-------- ----- ----- --------------
----- ----- ------------------ ---- --- ---- ----- --------------
--
--------------------------------- --------------- ----- -
-- ------- -
-------------------- ------- -------- -------
- ---- -
------------------ ------- ---------------
-
---
---在这个例子中,我们定义了一个 schema,包含了 name 和 email 两个字段。然后我们通过 post 方法注册了一个保存后的钩子函数,这个函数会使用 nodemailer 库发送一封电子邮件通知数据被成功保存的相关人员。
结论
本文详细介绍了 Mongoose
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67490c8b93696b02680be42d