Node.js與Sails~Model數據模型
對于Sails來說(shuo),它的(de)(de)Model與數(shu)據庫對應,不過它并沒有(you)(you)采用(yong)(yong)目(mu)前比較流行的(de)(de)poco貧血模型(xing)(xing),而是采用(yong)(yong)了類似DDD的(de)(de)充血模型(xing)(xing),即(ji)(ji)它的(de)(de)數(shu)據實(shi)體(ti)里即(ji)(ji)有(you)(you)數(shu)據庫字段(屬(shu)性)而且還有(you)(you)方法,而模型(xing)(xing)里的(de)(de)方法主要用(yong)(yong)來修(xiu)飾它的(de)(de)屬(shu)性,如屬(shu)性的(de)(de)有(you)(you)效性,屬(shu)性的(de)(de)賦值,插入(ru)前和更新(xin)前的(de)(de)動作(zuo)等(deng)(deng)等(deng)(deng),下面我們通過具體(ti)的(de)(de)實(shi)例代碼來說(shuo)一下sails實(shi)體(ti)模型(xing)(xing)的(de)(de)用(yong)(yong)法。
一 定義一個Person實體
module.exports = {
autoPK:true,//這是默認值,可以省略 tableName: 'UserInfo', attributes: { name: { type: 'string', size: 255 }, sex: { type: 'integer', defaultsTo: 0 }, updateCount:{ type:'integer', defaultsTo: 0 } } };
二 對model相關參數的說明
通過上面(mian)(mian)的代碼我(wo)們(men)知(zhi)道了在(zai)sails中數據(ju)模(mo)型(xing)的類(lei)型(xing),除了上面(mian)(mian)的string,integer,還有以下(xia)數據(ju)類(lei)型(xing)
- float
- text
- date
- datetime
- boolean
- binary
- array
- json
除(chu)了數據類型外,還有以下(xia)幾個知識點需要我們知道的
tableName:表示(shi)數據庫中(zhong)數據表的名(ming)稱(cheng)
defaultsTo:表示屬性(xing)的默認(ren)值
size:表示數據長(chang)度
email:可以添加對emial字段的(de)約束(shu),email:true
unique:表示這個字段在(zai)數據表中是(shi)唯一(yi)的(de)標示,如(ru)用(yong)(yong)戶表,有些業務要求用(yong)(yong)戶名是(shi)唯一(yi)的(de),我們就可(ke)以利用(yong)(yong)unique這個特(te)性,
primaryKey:可以讓我們把(ba)某個字(zi)段定義(yi)成數據表的主(zhu)鍵(jian),但在(zai)使用它(ta)時,要確保model的autoPK為false否則會有沖突(tu)(默認(ren)為true)
autoPK:是否自(zi)動(dong)生成(cheng)主鍵字(zi)段id,true表示自(zi)動(dong)生成(cheng)主鍵,false不生成(cheng),sails為各種(zhong)數據庫訂制了主鍵生成(cheng)規則,由mysql,sqlserver為自(zi)增主鍵,而mongodb為objectid主鍵
autoCreateAt:自動生成(cheng)createAt字(zi)段,即添加時(shi)間
autoUpdateAt:自動生成updateAt字(zi)段(duan),即當記錄有更新(xin)時,這個時間被自動更新(xin)
enum:表示某個字段(duan)可以(yi)以(yi)枚舉的(de)形式(shi)保存,它(ta)所存儲的(de)值為這個枚舉的(de)某個元素
columnName:為實體(ti)指(zhi)定(ding)特殊的數據表列名(ming),這類似于tableName
三 beforeUpdate和beforeCreate的作用
通過(guo)上面(mian)代碼(ma)我們可以在數據添加(jia)前和更新上做一些事情,這也是充(chong)血模型(xing)的(de)(de)優勢,它將(jiang)與屬性(xing)本身(shen)有關(guan)的(de)(de)邏輯寫到(dao)了屬性(xing)內容(rong),而不是寫在service方法里,這有效的(de)(de)提高了對象的(de)(de)內聚(ju)性(xing),也是面(mian)向(xiang)對象的(de)(de)體現,下面(mian)的(de)(de)代碼(ma)在記錄更新時,對updateCount字段進行(xing)加(jia)1操作,代碼(ma)很簡單,但可以說明(ming)它的(de)(de)作用。
beforeCreate: function (values, next) {
values.password = md5(values.password,"zzl");//添加記錄時,為密碼進行加密策(ce)略(lve),這由(you)于(yu)(yu)屬于(yu)(yu)密碼本身的(de)特性(xing),所(suo)以(yi)寫在這里比在業(ye)務代碼更合(he)適/
next();
}
beforeUpdate: function (values, next) {//values這個對象是從前臺(tai)傳過來的對象
values.updateCount+=1;
next();
}
這里(li)要(yao)注意(yi)一點(dian)(dian),你的values對象是前臺傳給(gei)service層的對象,不(bu)是從數據表里(li)取出來(lai)的原(yuan)始對象,這點(dian)(dian)要(yao)注意(yi),有些想(xiang)通過這個功能實現數據追蹤(zong)的,無法簡單實現!