55

我有一个供用户使用的猫鼬模式(UserSchema),我想验证电子邮件是否具有正确的语法。我目前使用的验证如下:

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

但是,这仅检查字段是否为空,而不检查语法。

是否已经存在可以重复使用的东西,或者我必须想出自己的方法并在 validate 函数中调用它?

4

8 回答 8

120

您还可以使用matchvalidate属性在架构中进行验证

例子

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']
    }
});
于 2014-06-13T22:48:04.177 回答
79

我使用验证器进行输入卫生,它可以以一种非常酷的方式使用。

安装它,然后像这样使用它:

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

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

工作一种享受,读起来很好。

于 2015-02-08T16:16:10.460 回答
22

您可以使用正则表达式。看看这个问题: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.')
于 2013-08-02T17:25:17.957 回答
12

验证器 不能很好地与 mongoose 一起摆脱将 isAsync 设置为 false 的警告

const validator = require('validator');

email:{
type:String,
validate:{
      validator: validator.isEmail,
      message: '{VALUE} is not a valid email',
      isAsync: false
    }
}
于 2017-06-26T16:26:53.390 回答
10

我知道这是旧的,但我没有看到这个解决方案,所以我想我会分享:

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"]
    }
});

您可以对要验证的任何类型执行此操作,只需传递适当的正则表达式即可。如果您搜索要验证的类型及其相关的正则表达式,则很容易找到解决方案。这将使您的验证保持一致,并将所有代码放入架构中,而不是挂起函数。

于 2020-03-25T18:33:14.930 回答
4

出于某种原因,在测试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.' }
于 2017-02-08T15:10:35.617 回答
4

模式的电子邮件类型 - mongoose-type-email

var mongoose = require('mongoose');
require('mongoose-type-email');

var UserSchema = new mongoose.Schema({
    email: mongoose.SchemaTypes.Email
});

可能的参考:

于 2018-07-09T15:53:19.620 回答
1
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'
    }
  }
于 2019-03-13T07:44:35.133 回答