3.12 Mongoose的中间件
中间件执行时间
前后钩子即pre()
和post()
方法,又称为中间件,是在执行某些操作时可以执行的函数。中间件在schema上指定,类似于静态方法或实例方法等,可以在数据库执行下列操作时,设置前后钩子
init
validate
save
remove
count
find
findOne
findOneAndRemove
findOneAndUpdate
insertMany
update
Serial串行
串行使用pre
方法,执行下一个方法使用next
调用
var schema = new Schema(...);
schema.pre('save',function(next){
//做点什么
next();
});
Parallel并行
并行提供更细粒度的操作
var schema = new Schema(...);
schema.pre('save',function(next,done){
//下一个要执行的中间件并行执行
next();
doAsync(done);
});
使用场景
复杂的验证
删除有主外关联的
doc
异步默认
某个特定动作触发异步任务,例如触发自定义事件和通知
例如,可以用来做自定义错误处理
schema.pre('save',function(next){
var err = new Eerror('some err');
next(err);
});
entity.save(function(err){
console.log(err.message); //some err
});
pre()前置先执行钩子
以find()方法为例,在执行find()方法之前,执行pre()方法
var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});
schema.pre('find',function(next){
console.log('我是pre方法1');
next();
});
schema.pre('find',function(next){
console.log('我是pre方法2');
next();
});
var temp = mongoose.model('temp', schema);
temp.find(function(err,docs){
console.log(docs[0]);
})
/*
我是pre方法1
我是pre方法2
{ _id: 5972ed35e6f98ec60e3dc886,name: 'huochai',age: 27,x: 1,y: 2 }
*/
post()前置后执行钩子
post()方法并不是在执行某些操作后再去执行的方法,==而在执行某些操作前最后执行的方法==,==post()方法里不可以使用next()==
var schema = new mongoose.Schema({ age:Number, name: String,x:Number,y:Number});
schema.post('find',function(docs){
console.log('我是post方法1');
});
schema.post('find',function(docs){
console.log('我是post方法2');
});
var temp = mongoose.model('temp', schema);
temp.find(function(err,docs){
console.log(docs[0]);
})
/*
我是post方法1
我是post方法2
{ _id: 5972ed35e6f98ec60e3dc886,name: 'huochai',age: 27,x: 1,y: 2 }
*/
注意:post 是在某些操作前 最后执行的方法,内部没有next()
总的执行时间顺序
最先执行 字段的Setter
然后执行 字段的validate
然后执行pre
最后执行post
Last updated
Was this helpful?