譯者: 飛龍 來源: Model ValidationsEnforce
子產品用于驗證資料。對于使用以前的驗證器的使用者,還可以繼續使用,它們中的一部分整合到了enforce,剩餘部分還沒有。推薦你開始使用
orm.enforce
來取代
orm.validators
。可用的驗證器的清單請見
node-enforce。
unique
驗證器也建構于ORM中,可以這樣來通路:
name: orm.enforce.unique("name already taken!")
name: orm.enforce.unique({ scope: ['age'] }, "Sorry, name already taken for this age group")
name: orm.enforce.unique({ ignoreCase: true }) // 'John' is same as 'john' (mysql is case insensitive by default)
你可以為模型的每個屬性定義驗證器。對于每個屬性,你可以定義一個或多個驗證器。你也可以使用預定義的驗證器,或者自己建立。
var Person = db.define("person", {
name : String,
age : Number
}, {
validations : {
name : orm.enforce.ranges.length(1, undefined, "missing"), // "missing" is a name given to this validation, instead of default
age : [ orm.enforce.ranges.number(0, 10), orm.enforce.lists.inside([ 1, 3, 5, 7, 9 ]) ]
}
});
上面的代碼限定了
name
的長度必須在1和undefined之間(undfined表示任意值),以及
age
必須在0和10(閉區間)之間,而且是列出的值之一。這個例子或許沒有意義,但是足夠解釋了。
儲存一個對象的時候,如果由任何一個驗證器驗證失敗,你都會得到一個帶有屬性名稱和驗證錯誤描述的
error
對象。這個描述可以幫助你弄清楚發生了什麼。
var John = new Person({
name : "",
age : 20
});
John.save(function (err) {
// err.field = "name" , err.value = "" , err.msg = "missing"
});
在第一個驗證器驗證失敗之後,驗證就停止了。如果你想要驗證每個屬性并且傳回所有驗證錯誤,你可以在全局或局部設定中更改這一行為:
var orm = require("orm");
orm.settings.set("instance.returnAllErrors", true); // global or..
orm.connect("....", function (err, db) {
db.settings.set("instance.returnAllErrors", true); // .. local
// ...
var John = new Person({
name : "",
age : 15
});
John.save(function (err) {
assert(Array.isArray(err));
// err[0].property = "name" , err[0].value = "" , err[0].msg = "missing"
// err[1].property = "age" , err[1].value = 15 , err[1].msg = "out-of-range-number"
// err[2].property = "age" , err[2].value = 15 , err[2].msg = "outside-list"
});
});