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();
            }
        }
    }
});
相關文章
相關標籤/搜索