2013-12-10 33 views
2

比方說,我有一個非常簡單的架構,並帶有一個總是返回false的自定義驗證函數。爲什麼Mongoose不驗證空文檔?

var MofoSchema = new mongoose.Schema({ 
    name: String 
}); 

MofoSchema.path('name').validate(function (value) { 
    console.log("I'm validating"); 
    return false; 
}, 'No pasaran'); 

mongoose.model('Mofo', MofoSchema); 

然後創建我的文檔的新實例,我驗證它:

var Mofo = mongoose.model('Mofo'); 
var mofo = new Mofo({name: "Tarte flambée"}); 

mofo.validate(function(err) { 
    console.log(err); 
}); 

完美,自定義驗證函數被調用,err被填滿。

但現在我做同樣的沒有數據

var Mofo = mongoose.model('Mofo'); 
var mofo = new Mofo({}); 

mofo.validate(function(err) { 
    console.log(err); 
}); 

自定義的驗證功能不叫err是不確定的。 爲什麼?我不明白爲什麼Mongoose沒有運行自定義驗證器。

這是行爲設計​​嗎?這是一個錯誤嗎? 我應該扭轉局面嗎?我應該在驗證之前手動檢查空數據嗎?

我做錯了什麼?

PS:如果你打電話給save,儘管有自定義驗證器,文檔將在MongoDB中保存爲空。

回答

3

我認爲貓鼬只會驗證現有的領域。

所以,你可以使用 '空' 值激活驗證

var mofo = new Mofo({name: null}); 

爲空或未定義

var MofoSchema = new mongoose.Schema({ 
    name: {type: String, required: true} 
}); 

MofoSchema.path('name').validate(function (value) {...}, 'no pasaran'); 
0

你可以這樣做:

var mofo = new Mofo({ name: { type: String, default: ''} }); 

這將確保你總是有該鍵上的一個值來觸發驗證。它還使您的架構定義更易於閱讀。