译者:飞龙node
来源:Model Hooksgit
若是你想要监听发生在模型实例上的事件,你能够附带一个函数,它会在发生时调用。github
如今支持下面这些事件:异步
afterLoad
:(无参数)加载和准备所用实例以后;函数
afterAutoFetch
:(无参数)自动获取关联(若是有的话)以后,不管有没有关联都会触发;this
beforeSave
:(无参数)尝试保存以前;code
afterSave
:(bool success)保存以后;orm
beforeCreate
:(无参数)尝试保存新的实例以前(优先于beforeSave
);对象
afterCreate
:(bool success)保存新的实例以后;事件
beforeRemove
:(无参数)尝试删除实例以前;
afterRemove
:(bool success)删除实例以后;
beforeValidation
:(无参数)在全部验证以前,优先于beforeCreate
和beforeSave
。
全部钩子函数调用时,this
为对应的实例,因此你能够访问到与之相关的任何东西。
对于全部before*
钩子,你能够添加一个额外的参数到钩子函数中。这个函数用来告诉钩子应该继续执行下去仍是中断。你或许已经从Express的工做流中熟悉了这一点。下面是一个示例:
var Person = db.define("person", { name : String, surname : String }, { hooks: { beforeCreate: function (next) { if (this.surname == "Doe") { return next(new Error("No Does allowed")); } return next(); } } });
这个工做流容许你在调用next
以前执行异步的操做。若是你不打算使用next
就不要把它定义为参数,不然会阻塞工做流。
一个常见问题涉及到在钩子内部的嵌套回调中访问this
。这个问题的缘由是,this
对象仅仅在顶级钩子函数的做用域内是有效的,而在回调中会有各类不一样的值。要解决这一问题,能够建立一个对象保存this
的引用,而且在回调中用它来访问模型的属性。
示例
var Person = db.define("person", { name : String, surname : String }, { hooks: { beforeCreate: function (next) { var _this = this; checkName(this, function(err, result)) { if(err) return next(err); _this.name = result.name; _this.surname = result.surname; next(); } } } });