Node.js與Sails之Model資料模型
對於Sails來說,它的Model與資料庫對應,不過它並沒有採用目前比較流行的poco貧血模型,而是採用了類似DDD的充血模型,即它的資料實體裡即有資料庫欄位(屬性)而且還有方法,而模型裡的方法主要用來修飾它的屬性,如屬性的有效性,屬性的賦值,插入前和更新前的動作等等,下面我們通過具體的例項程式碼來說一下sails實體模型的用法。
一 定義一個Person實體 module.exports = {autoPK:true,//這是預設值,可以省略
tableName: 'UserInfo',
attributes: {
name: {
type: 'string',
size: 255
},
sex: {
type: 'integer',
defaultsTo: 0
},
updateCount:{
type:'integer',
defaultsTo: 0
}
}
}; 二 對model相關引數的說明
通過上面的程式碼我們知道了在sails中資料模型的型別,除了上面的string,integer,還有以下資料型別
float text date datetime boolean binary array json除了資料型別外,還有以下幾個知識點需要我們知道的
tableName:表示資料庫中資料表的名稱
defaultsTo:表示屬性的預設值
size:表示資料長度
email:可以新增對emial欄位的約束,email:true
unique:表示這個欄位在資料表中是唯一的標示,如使用者表,有些業務要求使用者名稱是唯一的,我們就可以利用unique這個特性,
primaryKey:可以讓我們把某個欄位定義成資料表的主鍵,但在使用它時,要確保model的autoPK為false否則會有衝突(預設為true)
autoPK:是否自動生成主鍵欄位id,true表示自動生成主鍵,false不生成,sails為各種資料庫訂製了主鍵生成規則,由mysql,sqlserver為自增主鍵,而mongodb為objectid主鍵
autoCreateAt:自動生成createAt欄位,即新增時間
autoUpdateAt:自動生成updateAt欄位,即當記錄有更新時,這個時間被自動更新
enum:表示某個欄位可以以列舉的形式儲存,它所儲存的值為這個列舉的某個元素
columnName:為實體指定特殊的資料表列名,這類似於tableName
三 beforeUpdate和beforeCreate的作用通過上面程式碼我們可以在資料新增前和更新上做一些事情,這也是充血模型的優勢,它將與屬性本身有關的邏輯寫到了屬性內容,而不是寫在service方法裡,這有效的提高了物件的內聚性,也是面向物件的體現,下面的程式碼在記錄更新時,對updateCount欄位進行加1操作,程式碼很簡單,但可以說明它的作用。
beforeUpdate: function (values, next) {//values這個物件是從前臺傳過來的物件values.updateCount+=1;
next();
}
這裡要注意一點,你的values物件是前臺傳給service層的物件,不是從資料表裡取出來的原始物件,這點要注意,有些想通過這個功能實現資料追蹤的,無法簡單實現!