譯者:飛龍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(); } } } });