我有一个供用户使用的猫鼬模式(UserSchema),我想验证电子邮件是否具有正确的语法。我目前使用的验证如下:
UserSchema.path('email').validate(function (email) {
return email.length
}, 'The e-mail field cannot be empty.')
但是,这仅检查字段是否为空,而不检查语法。
是否已经存在可以重复使用的东西,或者我必须想出自己的方法并在 validate 函数中调用它?
您还可以使用match或validate属性在架构中进行验证
例子
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']
}
});
我使用验证器进行输入卫生,它可以以一种非常酷的方式使用。
安装它,然后像这样使用它:
import { isEmail } from 'validator';
// ...
const EmailSchema = new Schema({
email: {
//... other setup
validate: [ isEmail, 'invalid email' ]
}
});
工作一种享受,读起来很好。
您可以使用正则表达式。看看这个问题:Validate email address in JavaScript?
我过去用过这个。
UserSchema.path('email').validate(function (email) {
var emailRegex = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
return emailRegex.test(email.text); // Assuming email has a text attribute
}, 'The e-mail field cannot be empty.')
验证器 不能很好地与 mongoose 一起摆脱将 isAsync 设置为 false 的警告
const validator = require('validator');
email:{
type:String,
validate:{
validator: validator.isEmail,
message: '{VALUE} is not a valid email',
isAsync: false
}
}
我知道这是旧的,但我没有看到这个解决方案,所以我想我会分享:
const schema = new mongoose.Schema({
email: {
type: String,
trim: true,
lowercase: true,
unique: true,
validate: {
validator: function(v) {
return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(v);
},
message: "Please enter a valid email"
},
required: [true, "Email required"]
}
});
您可以对要验证的任何类型执行此操作,只需传递适当的正则表达式即可。如果您搜索要验证的类型及其相关的正则表达式,则很容易找到解决方案。这将使您的验证保持一致,并将所有代码放入架构中,而不是挂起函数。
出于某种原因,在测试中表现不佳。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.
}
但是mongoose 4.x(它也可能适用于旧版本)还有其他与单元测试一起工作的替代选项。
单个验证器:
email: {
type: String,
validate: {
validator: function(value) {
return value === 'correct@example.com';
},
message: 'Invalid email.',
},
},
多个验证器:
email: {
type: String,
validate: [
{ validator: function(value) { return value === 'handsome@example.com'; }, msg: 'Email is not handsome.' },
{ validator: function(value) { return value === 'awesome@example.com'; }, msg: 'Email is not awesome.' },
],
},
如何验证电子邮件:
我的建议:把它留给已经投入数百小时来构建适当的验证工具的专家。(这里也已经回答了)
npm install --save-dev validator
import { isEmail } from 'validator';
...
validate: { validator: isEmail , message: 'Invalid email.' }
模式的电子邮件类型 - mongoose-type-email
var mongoose = require('mongoose');
require('mongoose-type-email');
var UserSchema = new mongoose.Schema({
email: mongoose.SchemaTypes.Email
});
可能的参考:
email: {
type: String,
match: [/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, `Please fill valid email address`],
validate: {
validator: function() {
return new Promise((res, rej) =>{
User.findOne({email: this.email, _id: {$ne: this._id}})
.then(data => {
if(data) {
res(false)
} else {
res(true)
}
})
.catch(err => {
res(false)
})
})
}, message: 'Email Already Taken'
}
}