在 Mongoose 中,中间件是指在执行某些操作前或后,添加一些自定义的代码来完成一些额外的逻辑处理。Mongoose 中有四种类型的中间件:文档中间件、模式中间件、查询中间件和聚合中间件。
本文将介绍 Mongoose 中使用中间件的方法及实例,包括中间件的注册、使用、分类、实现和调试。其中,我们以使用文档中间件为例,通过详细说明其使用方法以及提供实际开发中会用到的例子,让读者掌握 Mongoose 中间件使用的技巧和经验,从而在实际开发中能够更加高效地使用 Mongoose。
中间件的注册
在 Mongoose 中,中间件的注册有两种方式:全局注册和实例注册。全局注册就是在 Schema
上注册中间件,所有通过这个 Schema
定义的模型都会应用该中间件。而实例注册就是在模型实例上单独注册中间件,只有这个模型实例会应用该中间件。钩子函数的签名可以是以下任意一种:
-- -------------------- ---- ------- -- ------ ---------- -------- -------------------- - -- --- ------- - -- ----- ---------- ---- --- ------ --------- -------- -------------------- - -- --- ------- - -- ---- ---------- ---- ----- -------- -------- ---------------- - -- --- ----- --- ---------------- --------- - -- ----- -------- ---------- -------- ----------------- ---- ----- - -- --- ---------- -
全局注册中间件:
-- -------------------- ---- ------- --- -------- - -------------------- --- ------ - ---------------- --- ------------ - --- -------- -- --- -- --- ------------------------ -------------- - -- ------ -- --- ------ ----- ----- -------------- - --- ------- ------- --- --- ------ - ------------------------ --------------
在上面的代码最后一行,我们用 mongoose.model
注册了 Person
这个模型,这样在之后我们就可以使用 Person
这个模型了。这个模型上应用了一个 pre-save
的中间件,在保存之前设置了 updatedAt
的时间戳。
实例注册中间件:
-- -------------------- ---- ------- --- --- - --- ---------- ---------------- - -------------- - -- -- --------- ------- -- ------------------- - -- ---- ---- ------- -------------- ------ ------- --- ---- -- ------- -- --- ----- ---------- ---
实际开发中的例子
下面,我们以开发一个博客系统为例,介绍如何在 Mongoose 中使用中间件实现更高效的编程。
- 使用文档中间件实现自动添加时间戳
博客系统需要保存文章的创建时间和修改时间。为了方便实现这个功能,我们可以使用文档中间件来自动添加时间戳。
-- -------------------- ---- ------- -- ---------- --- -------- - -------------------- --- ------------- - --- ----------------- ------ ------- -------- ------- ---------- ----- ---------- ---- --- ------------------------- -------------- - --- - --- ------- -------------- - ---- -- ----------------- - -------------- - ---- - ------- --- -------------- - ------------------------- ---------------
在上面的代码中,我们定义了一个 Article 模型,并且在它的 Schema 中使用了文档中间件。在每次保存 Article
实例时,都会先执行 pre('save') 的中间件:将当前时间赋值给 updatedAt
。
-- -------------------- ---- ------- -- ------ --- -------- - -------------------- ------- - ---------------------------- ---------- - ----------------------- -------------- - --------------------------- ------- - ------------------- --- - ---------- --------------------------------------------- ------------- -------- ------- ------------------------------- --------- ---- ---- --------------------------- ----------------------------------- ------------ ------------- ---- - -------------------------- --- -------------------- ------------- ---- - ---------------- ------------- --------- - -- ----- - ----------------- - ---- - ---------------------------- - --------- -------- --- - --- --- ---------------- ---------- - ------------------- ------- -- ---- ------- ---
在上面的代码中,我们通过 express 框架搭建了服务器,并且引入了 body-parser
、method-override
等中间件。但在此处没有直接用到“中间件的方法及实例”,故下面再举几个使用中间件的例子。
- 使用文档中间件实现文件上传
博客系统需要保存文章的封面图片。为了实现上传图片的功能,我们可以使用文档中间件来保存图片的路径。
-- -------------------- ---- ------- -- ---------- --- -------- - -------------------- ---- - ---------------- -------- - ------------------------------------ --- ------------- - --- ----------------- ------ ------- -------- ------- ----------- ------ --- ------------------------- -------------- - --- ------- - ----- -- ----------------------------------- ------ ------- -- -------- ------- -- ------------------- -- ---------------------------------- --- -- - -- ----------------- ---------------------- - --------- - -------------------- - ---------------------------------------------- ---------------- - -- ------ ------------------ - ----------- ------- -- - ------- ------ --- --- -------------- - ------------------------- ---------------
在上面的代码中,我们修改了 Article
的 Schema ,增加了 coverImage
字段。在每次保存 Article
实例时,都会先执行 pre('save') 的中间件来上传图片,然后将其路径保存到 coverImage
字段中。
- 使用查询中间件实现排序
博客系统需要以修改时间倒序排列文章。为了实现这个功能,我们可以使用查询中间件来自动添加排序条件。
-- -------------------- ---- ------- -- ---------- --- -------- - -------------------- --- ------------- - --- ----------------- ------ ------- -------- ------- ---------- ----- ---------- ---- --- ------------------------- -------------- - ----------- ---------- -- --- ------- --- -------------- - ------------------------- ---------------
在上面的代码中,我们修改了 Article
的 Schema ,在 query 上应用 preprocesser 中间件,添加了排序条件。
- 使用模式中间件实现密码加密
博客系统需要注册用户,为了保证用户信息的安全,我们需要对用户的密码进行加密。为了实现这个功能,我们可以使用模式中间件来自动加密密码。
-- -------------------- ---- ------- -- ------- --- -------- - -------------------- --- ------ - ------------------------- --- ---------- - --- ----------------- --------- ------- --------- ------ --- ---------------------- -------------- - --- ---- - ----- -- ------------------------------ ------ ------- ------------------ ------------- ----- - -- ----- ------ ---------- -------------------------- ----- ----- ------------- ----- - -- ----- ------ ---------- ------------- - ----- ------- --- --- --- ---------------------------------- - ------------------ --------- - ------------------------ -------------- ------------- -------- - -- ----- ------ -------------- -------------- --------- --- -- -------------- - ---------------------- ------------
在上面的代码中,我们定义了一个 User 模型,并且在它的 Schema 中使用了模式中间件。在每次保存 User
实例时,都会先执行 pre('save') 的中间件:将密码进行加密。同时还定义了方法 comparePassword
来比较密码是否相等。
总结
在 Mongoose 中使用中间件可以很方便地实现一些常见的开发需求,如添加时间戳、上传文件、排序和密码加密等。中间件的分类和实现方法有一定的技巧和经验,需要在实际开发中多加练习和总结。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e81cfbf6b2d6eab338cc32