orm2 中文文档 3.3 模型钩子

译者:飞龙node

来源:Model Hooksgit

若是你想要监听发生在模型实例上的事件,你能够附带一个函数,它会在发生时调用。github

如今支持下面这些事件:异步

  • afterLoad:(无参数)加载和准备所用实例以后;函数

  • afterAutoFetch:(无参数)自动获取关联(若是有的话)以后,不管有没有关联都会触发;this

  • beforeSave:(无参数)尝试保存以前;code

  • afterSave:(bool success)保存以后;orm

  • beforeCreate:(无参数)尝试保存新的实例以前(优先于beforeSave);对象

  • afterCreate:(bool success)保存新的实例以后;事件

  • beforeRemove:(无参数)尝试删除实例以前;

  • afterRemove:(bool success)删除实例以后;

  • beforeValidation:(无参数)在全部验证以前,优先于beforeCreatebeforeSave

全部钩子函数调用时,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();
            }
        }
    }
});
相关文章
相关标签/搜索