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);
    });

使用场景

  1. 复杂的验证

  2. 删除有主外关联的doc

  3. 异步默认

  4. 某个特定动作触发异步任务,例如触发自定义事件和通知

例如,可以用来做自定义错误处理

    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()

总的执行时间顺序

  1. 最先执行 字段的Setter

  2. 然后执行 字段的validate

  3. 然后执行pre

  4. 最后执行post

Last updated

Was this helpful?