怎么理解 Mongoose 的 .pre() 中间件, 还有 .path()
发布于 2年前 作者 jiyinyiyong 2757 次浏览

官网上的例子看不懂, 这个是类似监听事件之类触发的函数么?

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

http://mongoosejs.com/docs/middleware.html

.path() 也很难懂啊:

schema.path('name') // returns a SchemaType
schema.path('name', Number) // changes the schemaType of `name` to Number
11 回复

我曾经翻译过mongoose的文档,并对里面的很多例子进行了实践,虽然不多,一开始也有很多疑惑,但是使用多了,就慢慢知道什么意思了。 8.Middleware中间件 8.1 什么是中间件 中间件是一种控制函数,类似插件,能控制流程中的init、validate、save、remove方法 8.2 中间件的分类 8.2.1 Serial串行 串行使用pre方法,执行下一个方法使用next调用 var schema = new Schema(…); schema.pre('save’,function(next){ //做点什么 next(); }); 8.2.2 Parallel并行 并行提供更细粒度的操作 var schema = new Schema(…); schema.pre('save’,function(next,done){ //下一个要执行的中间件并行执行 next(); doAsync(done); }); 8.3 中间件特点 一旦定义了中间件,就会在全部中间件执行完后执行其他操作 使用中间件可以雾化模型,避免异步操作的层层迭代嵌套 8.4 使用范畴 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 }); 不知道这看的明不明白,简单的说,中间件就相当于java中的过滤器、拦截器,在执行某个方法前,将其拦截住,也有点像AOP中的前置注入。举个简单的例子,当我们要执行save方法时,我们往往需要对存入的数据进行验证,虽然mongoose提供了safe、strict、schematype、default、validaition验证,但是这些验证都没有提供完善的错误处理或者拦截机制,而利用中间件,可以对错误的数据进行拦截、错误处理、修订等等。比如存入的用户名可能带有代码注入,这时候,通过中间件拦截用户名,给与转义,或进行错误提示、日志记录等。经过中间件的拦截,进入到save方法的数据从理想状态下应该是符合规范且完善的。由此看来,safe、strict、schematype、default、validaition本身就是内部提供的中间件。 关于path,其实也是一种中间件,如同xml的path解析,mongoose是针对mongodb数据库的一种orm模型,mongodb是javascript的json数据存储,有的时候,我们并不希望中间件只针对一个操作,而是针对操作对象的某个属性,那么就能使用path快速定位。这个类似于2.x的get和set方法,只是3.x貌似取消了。 3.x相对于2.x来说,有比较大的改进,学习的时候还得有2.x的一些基础方可。

代码没标记, 标记下吧…

@jiyinyiyong 没有教程教我怎么标记代码呀,我也很纳闷

@a272121742 Markdown 啦 教程是英文的 http://github.github.com/github-flavored-markdown/ 中文的有细微的版本不同 http://wowubuntu.com/markdown/ 晕倒, 我忘了评论是不能修改的.

类似已于MS SqlServer中的存储过程?

在存储过程里,可以对数据进行验证,如果发现错误即可选择进行回滚操作。可能中间件,就是在模仿存储过程这一思想。

@jiyinyiyong 我擦,还得去学习markdown,我记得淘宝有个团队写过一个markdown的教程。http://ued.taobao.com/blog/2012/07/03/getting-started-with-markdown/ 不过还是谢谢了~

@a272121742 只要记住```代码标记和别在句首放特殊符号就好了 那个, 有没有稍微具体的例子可以解释这几个方法啊?

@jiyinyiyong 大神,请受小神膜拜,有空我把我写的mongoose观后文档贴出来吧,敬请见谅,欢迎雅正,多多传授,共同进步~

@a272121742 - -! 我连 HTTP 都没学完撒… 基本都菜鸟, 等待楼上的分享

pre是在执行save操作之前执行的函数,可以定义多个,并用next实现业务连接,不用next只会调用第一个。nodejs的技术欢迎加群聊262658247

呃,我发现我有理解,但是很难说出来…

就类似connect是一样的.

创建一个执行连

model.pre -> schema.pre -> schema.save

model.pre 可以是具体业务逻辑的一些数据验证,或者原始数据转换.

schema.pre 跟业务无关的数据操作

回到顶部