在 Mongoose 中,Hooks 可以用来在操作数据库前或后执行一些操作。这些操作可以是修改数据、验证数据等。
Hooks 的种类
Mongoose 中有四种 Hooks,分别是:
- document middleware
- model middleware
- aggregate middleware
- query middleware
Document Middleware
Document Middleware 是在操作单个文档(document)时执行的钩子,可以用来修改文档、验证文档等。
Document Middleware 又分为以下两种:
- pre
- post
pre
pre 钩子在操作前执行,可以用来修改数据,例如在保存前对数据进行加密:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- --------- ------- --------- ------ --- ---------------------- -------------- - ----- ---- - ----- -------------------------- --- ------------- ----- - -- ----- ------ ---------- ------------- - ----- ------- --- ---
这个例子中,我们在保存用户数据前对密码进行了加密。
post
post 钩子在操作后执行,可以用来做一些与数据库操作无关的事情,例如发送邮件:
userSchema.post('save', function(user) { sendEmail(user.email, 'Welcome to our site!'); });
Model Middleware
Model Middleware 是在对整个模型(model)进行操作时执行的钩子,可以用来修改数据、验证数据等。
Model Middleware 又分为以下两种:
- pre
- post
pre
pre 钩子在操作前执行,可以用来修改数据,例如在删除用户前删除用户的所有文章:
userSchema.pre('remove', function(next) { const user = this; Article.deleteMany({ author: user._id }, next); });
这个例子中,我们在删除用户前删除了用户的所有文章。
post
post 钩子在操作后执行,可以用来做一些与数据库操作无关的事情,例如记录日志:
userSchema.post('remove', function(user) { log('User ' + user.username + ' deleted.'); });
Aggregate Middleware
Aggregate Middleware 是在对聚合操作(aggregate)进行操作时执行的钩子,可以用来修改数据、验证数据等。
Aggregate Middleware 又分为以下两种:
- pre
- post
pre
pre 钩子在操作前执行,可以用来修改数据,例如在聚合前限制查询结果的数量:
userSchema.pre('aggregate', function(next) { const pipeline = this.pipeline(); pipeline.unshift({ $limit: 100 }); next(); });
这个例子中,我们在聚合前限制了查询结果的数量。
post
post 钩子在操作后执行,可以用来做一些与数据库操作无关的事情,例如记录日志:
userSchema.post('aggregate', function(result) { log('Aggregate result: ' + result); });
Query Middleware
Query Middleware 是在对查询操作(query)进行操作时执行的钩子,可以用来修改数据、验证数据等。
Query Middleware 又分为以下两种:
- pre
- post
pre
pre 钩子在操作前执行,可以用来修改数据,例如在查询前限制查询结果的数量:
userSchema.pre('find', function() { this.limit(100); });
这个例子中,我们在查询前限制了查询结果的数量。
post
post 钩子在操作后执行,可以用来做一些与数据库操作无关的事情,例如记录日志:
userSchema.post('find', function(result) { log('Find result: ' + result); });
总结
Hooks 是 Mongoose 中非常重要的一个功能,可以用来在操作数据库前或后执行一些操作。在使用 Hooks 时,我们需要注意钩子的种类和执行时机,以及如何正确地使用钩子来修改数据、验证数据等。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65d3da31add4f0e0ffbefa44