2013-08-02 30 views
24

Tôi có lược đồ mongoose cho người dùng (UserSchema) và tôi muốn xác thực xem email có đúng cú pháp hay không. Xác thực mà tôi hiện đang sử dụng là:Mongoose - xác thực cú pháp email

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

Tuy nhiên, điều này chỉ kiểm tra xem trường có trống hay không, chứ không phải cho cú pháp.

Có điều gì đó đã tồn tại mà tôi có thể sử dụng lại hoặc tôi sẽ phải đưa ra phương pháp của riêng mình và gọi hàm bên trong hàm xác thực không?

Trả lời

13

Bạn có thể sử dụng regex. Hãy xem câu hỏi này: Validate email address in JavaScript?

Tôi đã sử dụng điều này trong quá khứ.

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

Awesome! Tôi cũng không biết về phương thức test(). – Tamas

+2

Bạn nên xác định regex bên ngoài hàm để có hiệu suất tốt hơn. – Killah

+3

Regex này không xác thực được một số email hợp lệ, chẳng hạn như các dấu cộng bao gồm ký hiệu dấu cộng ở bên trái. –

55

bạn cũng có thể sử dụng trận đấu hoặc Validate tài sản để xác nhận trong lược đồ

dụ

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

giải pháp tốt đẹp. nhưng chỉ có vấn đề là nó không vượt qua quy tắc regex eslint. bạn có thể vui lòng cập nhật không? – blackiii

+4

Sự khác nhau giữa 'validate' và' match' là gì? – Anatoly

37

tôi sử dụng validator cho vệ sinh đầu vào của tôi, và nó có thể được sử dụng một cách khá hay.

Cài đặt nó, và sau đó sử dụng nó như vậy:

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

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

một công trình xử, và đọc độc đáo.

+0

cho ES5 :), const validator = require ('validator'); xác thực: [validator.isEmail, 'email không hợp lệ'], –

+1

'const' không có sẵn trong ES5. –

+0

aha xin lỗi tôi đã mất tích để chỉnh sửa "var" :) –

0

Tôi đã thực hiện , xác định loại trường tùy chỉnh hoàn chỉnh với xác thực email.

3

Vì một lý do nào đó validate: [ isEmail, 'Invalid email.'] không hoạt động tốt với thử nghiệm 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. 
} 

Nhưng mongoose 4.x (nó có thể làm việc cho các phiên bản cũ quá) có các tùy chọn thay thế khác mà làm việc tay trong tay với Unit tests.

validator Độc thân:

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

Nhiều xác nhận:

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.' }, 
    ], 
}, 

Làm thế nào để xác nhận email:

Tôi đề nghị: hàng trăm Để lại rằng các chuyên gia đã đầu tư số giờ xây dựng ing các công cụ xác nhận hợp lệ.(Đã được trả lời trong here cũng)

npm install --save-dev validator

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

Các validator chơi Dosn't tốt với mongoose để thoát khỏi cảnh báo thiết isAsync false

const validator = require('validator'); 

email:{ 
type:String, 
validate:{ 
     validator: validator.isEmail, 
     message: '{VALUE} is not a valid email', 
     isAsync: false 
    } 
} 
Các vấn đề liên quan