zoukankan      html  css  js  c++  java
  • [译]Mongoose指南

    中间件是一些函数, 当document发生init, validate, save和remove方法的时候中间件发生. 

    中间件都是document级别的不是model级别的.

    下面讲讲两种中间件pre和post

    pre

    一共有两种pre中间件serial和parallel 发生在被附挂方法之前

    serial

    serial中间件是一个一个执行的串行执行

    var schema = new Schema(..);
    schema.pre('save', function(next){
      //do stuff
      next();
    });
    

    parallel

    并行执行

    var schema = new Schema({...});
    schema.pre('save', true, function(next, done){
       //calling next kicks off the next middleware in parallel
       next();
       doAsync(done);
    });
    

    这个例子中被hooked的方法是save, 直到所有的中间件都done了save才会真正被执行

    错误处理

    如果中间件调用一个包含error的next, 流程会被终止, 错误会被发送到callback

    schema.pre('save', function(next){
      var err = new Error('something went wrong');
      next(err);
    });
    
    //later...
    
    myDoc.save(function(err){
      console.log(err.message) // something went wrong
    });
    

      

    post

    发生在被附挂的方法之后. post中间件不直接参与到整个流程, 所以他的callback没有next也没有done

    schema.post('init', function (doc) {
      console.log('%s has been initialized from the db', doc._id);
    })
    schema.post('validate', function (doc) {
      console.log('%s has been validated (but not saved yet)', doc._id);
    })
    schema.post('save', function (doc) {
      console.log('%s has been saved', doc._id);
    })
    schema.post('remove', function (doc) {
      console.log('%s has been removed', doc._id);
    })
    

    注意了!!!

    如果更新操作直接发生在数据库上pre和post不会被调用, 包含Model.update,  findByIdAndUpdate, findOneAndUpdate, findOneAndRemove, findByIdAndRemove

  • 相关阅读:
    通过线程池,从hbase中拿数据
    phoenix如何压缩表,以及如何映射表
    spring boot改造现有jms activeMQ配置
    windows安装redis
    mysql免安装版配置
    转发和重定向的区别
    object.equals(null)和object==null区别
    用IDEA学习getRealPath遇到的问题
    总误按win+Enter键弹出讲述人
    戴尔电脑插耳机后声音变化问题
  • 原文地址:https://www.cnblogs.com/irocker/p/mongoose-middleware.html
Copyright © 2011-2022 走看看