2013-08-02 100 views
24

我有一個貓鼬模式的用戶(UserSchema),我想驗證電子郵件是否有正確的語法。我目前使用的驗證如下:貓鼬 - 驗證電子郵件語法

UserSchema.path('email').validate(function (email) { 
    return email.length 
}, 'The e-mail field cannot be empty.') 

但是,這僅檢查該字段爲空或沒有,而不是語法。

確實已經存在,我可以重新使用,或者我必須拿出我自己的方法,並在驗證功能內調用?

回答

13

您可以使用正則表達式。看看這個問題:Validate email address in JavaScript?

我以前用過這個。

UserSchema.path('email').validate(function (email) { 
    var emailRegex = /^([\w-\.][email protected]([\w-]+\.)+[\w-]{2,4})?$/; 
    return emailRegex.test(email.text); // Assuming email has a text attribute 
}, 'The e-mail field cannot be empty.') 
+0

真棒!我也不知道test()方法。 – Tamas

+2

您應該在函數之外定義regex以獲得更好的性能。 – Killah

+3

該正則表達式無法驗證一些有效的電子郵件,例如那些包含左側加號的電子郵件。 –

55

你也可以使用比賽驗證財產進行驗證的架構

例如

var validateEmail = function(email) { 
    var re = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; 
    return re.test(email) 
}; 

var EmailSchema = new Schema({ 
    email: { 
     type: String, 
     trim: true, 
     lowercase: true, 
     unique: true, 
     required: 'Email address is required', 
     validate: [validateEmail, 'Please fill a valid email address'], 
     match: [/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/, 'Please fill a valid email address'] 
    } 
}); 
+0

不錯的解決方案。但唯一的問題是它不通過eslint正則表達式規則。你能否更新? – blackiii

+4

'validate'和'match'有什麼區別?用於ES5的 – Anatoly

37

我用validator我輸入的衛生,並且它可以以非常酷的方式使用。

安裝它,然後使用它像這樣:

import { isEmail } from 'validator'; 
// ... 

const EmailSchema = new Schema({ 
    email: { 
     //... other setup 
     validate: [ isEmail, 'invalid email' ] 
    } 
}); 

作品一種享受,並很好地讀取。

+0

:),const validator = require('validator');驗證:[validator.isEmail,'無效的電子郵件'], –

+1

'const'在ES5中不可用。 –

+0

對不起,我錯過了編輯「var」:) –

0

我製作了,它定義了一個自定義字段類型的完整郵件驗證。

3

由於某種原因 validate: [ isEmail, 'Invalid email.'] validate()測試不能很好地發揮作用。

const user = new User({ email: 'invalid' }); 
try { 
    const isValid = await user.validate(); 
} catch(error) { 
    expect(error.errors.email).to.exist; // ... it never gets to that point. 
} 

貓鼬4.x的(可能爲舊版本的工作太)具有攜手與單元測試的其他選擇。

單驗證:

email: { 
    type: String, 
    validate: { 
    validator: function(value) { 
     return value === '[email protected]'; 
    }, 
    message: 'Invalid email.', 
    }, 
}, 

多重驗證:

email: { 
    type: String, 
    validate: [ 
    { validator: function(value) { return value === '[email protected]'; }, msg: 'Email is not handsome.' }, 
    { validator: function(value) { return value === '[email protected]'; }, msg: 'Email is not awesome.' }, 
    ], 
}, 

如何驗證電子郵件:

我的建議:把它留給專家誰已經投入上百幾個小時建成適當的驗證工具。(已經在here回答爲好)

npm install --save-dev validator

import { isEmail } from 'validator'; 
... 
validate: { validator: isEmail , message: 'Invalid email.' } 
2

validator 不到風度發揮出色以貓鼬擺脫警告的設置isAsync假

const validator = require('validator'); 

email:{ 
type:String, 
validate:{ 
     validator: validator.isEmail, 
     message: '{VALUE} is not a valid email', 
     isAsync: false 
    } 
}