Mongoose 是一个优秀的 Node.js ORM 框架,它提供了很多强大的功能,其中之一就是中间件。中间件是一种在执行某个操作之前或之后执行的函数。在 Mongoose 中,我们可以使用中间件来增强模型的功能,例如在保存文档之前进行验证、在删除文档之前进行操作等等。
中间件的分类
在 Mongoose 中,中间件分为以下四种:
- document middleware:文档中间件,用于在文档级别触发事件。
- model middleware:模型中间件,用于在模型级别触发事件。
- aggregate middleware:聚合中间件,用于在聚合级别触发事件。
- query middleware:查询中间件,用于在查询级别触发事件。
document middleware
文档中间件是在文档级别触发的中间件,它们可以在文档保存、更新、删除等操作之前或之后执行。在 Mongoose 中,文档中间件分为以下四种:
init
:在文档实例化之后触发。validate
:在文档验证之前触发。save
:在文档保存之前触发。remove
:在文档删除之前触发。
下面是一个使用文档中间件的示例代码:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, email: String, password: String, }); userSchema.pre('save', function (next) { console.log('before save'); next(); }); const User = mongoose.model('User', userSchema); const user = new User({ name: 'John Doe', email: 'john@example.com', password: '123456' }); user.save((err) => { if (err) { console.log(err); } else { console.log('saved'); } });
在上面的代码中,我们使用了 pre
方法来注册一个在保存文档之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next
方法,表示中间件执行完毕。当我们执行 user.save
方法时,会先执行这个中间件,然后再保存文档。
model middleware
模型中间件是在模型级别触发的中间件,它们可以在模型创建、删除等操作之前或之后执行。在 Mongoose 中,模型中间件分为以下两种:
init
:在模型实例化之后触发。remove
:在模型删除之前触发。
下面是一个使用模型中间件的示例代码:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, email: String, password: String, }); userSchema.pre('remove', function (next) { console.log('before remove'); next(); }); const User = mongoose.model('User', userSchema); User.deleteMany({}, (err) => { if (err) { console.log(err); } else { console.log('removed'); } });
在上面的代码中,我们使用了 pre
方法来注册一个在删除模型之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next
方法,表示中间件执行完毕。当我们执行 User.deleteMany
方法时,会先执行这个中间件,然后再删除模型。
aggregate middleware
聚合中间件是在聚合级别触发的中间件,它们可以在聚合查询之前或之后执行。在 Mongoose 中,聚合中间件分为以下两种:
initialize
:在聚合实例化之后触发。execute
:在聚合查询之前触发。
下面是一个使用聚合中间件的示例代码:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, email: String, password: String, }); const User = mongoose.model('User', userSchema); User.aggregate() .match({ name: 'John Doe' }) .pre('execute', function (next) { console.log('before execute'); next(); }) .exec((err, result) => { if (err) { console.log(err); } else { console.log(result); } });
在上面的代码中,我们使用了 pre
方法来注册一个在聚合查询之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next
方法,表示中间件执行完毕。当我们执行 User.aggregate
方法时,会先执行这个中间件,然后再进行聚合查询。
query middleware
查询中间件是在查询级别触发的中间件,它们可以在查询操作之前或之后执行。在 Mongoose 中,查询中间件分为以下两种:
count
:在查询数量之前触发。find
:在查询文档之前触发。
下面是一个使用查询中间件的示例代码:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, email: String, password: String, }); const User = mongoose.model('User', userSchema); User.find({}) .pre('find', function (next) { console.log('before find'); next(); }) .exec((err, result) => { if (err) { console.log(err); } else { console.log(result); } });
在上面的代码中,我们使用了 pre
方法来注册一个在查询文档之前执行的中间件。在这个中间件中,我们打印了一条信息,然后调用了 next
方法,表示中间件执行完毕。当我们执行 User.find
方法时,会先执行这个中间件,然后再进行查询操作。
总结
中间件是 Mongoose 中一个非常强大的功能,它可以让我们在执行某个操作之前或之后执行一些操作,从而增强模型的功能。在使用中间件时,我们需要注意中间件的分类和注册方式,以及中间件的执行顺序和调用方式。希望本文能够帮助大家更好地理解和使用 Mongoose 中的中间件功能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658b704aeb4cecbf2d0b5c0d