Mongoose - 验证电子邮件语法

时间:2013-08-02 16:59:20

标签: node.js mongodb mongoose

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

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

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

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

7 个答案:

答案 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
});