2014-02-18 24 views
3

我從貓鼬驗證此消息:貓鼬驗證:要求:假的,驗證:正則表達式,問題與空值

「驗證失敗路徑手機價值``」

這不應該發生因爲手機不是必需的。

這裏是我的模型模式:

var user = new Schema(
{ 
    _id  : { type: String, required: true }, 
    name  : { type: String, required: true}, 
    phone : { type: String, required: false, validate: /^\d{10}$/ }, 
    password : { type: String }, 
    added : { type: Date, default: Date.now }, 
}, 
{collection : 'users'} 
); 

看來當我使用required: false並設置驗證屬性了那貓鼬的驗證失敗。 如果我將其更改爲:

phone : { type: String, required: false}, 

一切正常,爲什麼? 我在做什麼錯?

回答

1

您可以用自定義的驗證嘗試,因爲他們只觸發時,有一個給定鍵的值,因爲自定義驗證密鑰選擇通過path()完成:

var user = new Schema({ 

    // ... 
    phone : { type: String }, // using default - required:false 
    // ... 

}); 

// Custom validation 
user.path('phone').validate(function (value) { 

    // Your validation code here, should return bool 

}, 'Some error message'); 

看一看這個問題:Why Mongoose doesn't validate empty document?

如果驗證失敗,這也將有效地防止文檔被持久化到數據庫,除非您相應地處理錯誤。

BonusTip:嘗試的方法自定義驗證的簡單方法,例如儘量避免循環儘可能避免使用像lodash庫或強調了在我的經驗,我已經看到了這些可能有處理大量交易時,性能成本很高。

2

我認爲你的正則表達式在空字符串驗證失敗,在這種情況下應該是有效的,因爲這個字段不是必需的。你爲什麼不試試這個正則表達式:

/^$|^\d{10}$/ 

這將匹配一個空字符串或10位數字。

+1

嗯,事實上我不想貓鼬存儲空值,它不應該被存放在一切,不會觸發驗證錯誤或者 –

+0

那麼你爲什麼不使手機領域需要? –

+1

我不希望它是必需的,它是一個可選字段,用戶不會被迫填充它,但如果他們確實提供了電話,那麼我想要貓鼬來驗證它,這是否有意義? –

0

您可以簡單地檢查輸入的值是否存在(不爲空或未定義)。如果它存在,然後測試正則表達式:

var user = new Schema(
{ 
    _id  : { type: String, required: true }, 
    name  : { type: String, required: true}, 
    phone : { type: String,/*not required by default**/ 
       validate: { 
        validator: function(v) { 
         var re = /^\d{10}$/; 
         return (v == null || v.trim().length < 1) || re.test(v) 
        }, 
        message: 'Provided phone number is invalid.' 
       } 
    }, 
    password : { type: String }, 
    added : { type: Date, default: Date.now }, 
}, 
{collection : 'users'} 
);