我有一个用户的mongoose架构(UserSchema),我想验证电子邮件是否具有正确的语法。我目前使用的验证如下:
UserSchema.path('email').validate(function (email) {
return email.length
}, 'The e-mail field cannot be empty.')
但是,这只会检查字段是否为空,而不是语法。
我是否已经存在可以重复使用的东西,或者我必须提出自己的方法并在验证函数中调用它?
答案 0 :(得分:77)
您还可以使用匹配或验证属性进行架构验证
例如
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']
}
});
答案 1 :(得分:48)
我使用validator作为我的输入卫生设备,它可以非常酷的方式使用。
安装它,然后像这样使用它:
import { isEmail } from 'validator';
// ...
const EmailSchema = new Schema({
email: {
//... other setup
validate: [ isEmail, 'invalid email' ]
}
});
工作得很好,读得很好。
答案 2 :(得分:13)
您可以使用正则表达式。看看这个问题: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.')
答案 3 :(得分:7)
validator dos不能很好地与mongoose一起摆脱警告集isAsync to false
const validator = require('validator');
email:{
type:String,
validate:{
validator: validator.isEmail,
message: '{VALUE} is not a valid email',
isAsync: false
}
}
答案 4 :(得分:5)
我知道这很旧,但是我看不到这个解决方案,所以我想分享一下:
RUN . /root/.bashrc && \
/root/anaconda3/bin/conda init bash && \
/root/anaconda3/bin/conda create -n py37 python=3.7 anaconda && \
/root/anaconda3/bin/conda activate py37
您可以对要验证的任何类型执行此操作,只需传递适当的正则表达式即可。如果您用谷歌搜索您要验证的类型及其相关的正则表达式,则很容易找到解决方案。这将使您的验证保持一致,并将所有代码放入架构中,而不是挂起函数。
答案 5 :(得分: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.
}
但 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.' },
],
},
如何验证电子邮件:
我的建议:将这一点交给那些投入数百小时建立适当验证工具的专家。 (已在here中回答)
npm install --save-dev validator
import { isEmail } from 'validator';
...
validate: { validator: isEmail , message: 'Invalid email.' }
答案 6 :(得分:1)
模式的电子邮件类型-mongoose-type-email
var mongoose = require('mongoose');
require('mongoose-type-email');
var UserSchema = new mongoose.Schema({
email: mongoose.SchemaTypes.Email
});