Mangosta-validar sintaxis de correo electrónico


Tengo un esquema de mangosta para usuarios (UserSchema) y me gustaría validar si el correo electrónico tiene la sintaxis correcta. La validación que uso actualmente es la siguiente:

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

Sin embargo, esto solo comprueba si el campo está vacío o no, y no para la sintaxis.

¿Ya existe algo que pueda reutilizar o tendría que idear mi propio método y llamarlo dentro de la función validate?

Author: Tamas, 2013-08-02

6 answers

Puede usar una expresión regular. Echa un vistazo a esta pregunta: ¿Validar la dirección de correo electrónico en JavaScript?

He usado esto en el pasado.

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.')
 13
Author: dannyp32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:02

También puede usar la propiedad match o la propiedad validate para la validación en el esquema

Ejemplo

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']
    }
});
 65
Author: ramon22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-22 17:12:43

Utilizo validador para mi saneamiento de entrada, y se puede utilizar de una manera bastante genial.

Instálalo, y luego úsalo así:

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

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

Funciona muy bien, y se lee muy bien.

 45
Author: Kris Selbekk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-10 21:36:15

El validador dosn't juega bien con mangosta para deshacerse del conjunto de advertencia IsAsync a false

const validator = require('validator');

email:{
type:String,
validate:{
      validator: validator.isEmail,
      message: '{VALUE} is not a valid email',
      isAsync: false
    }
}
 4
Author: Patryk Acuña,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-26 16:26:53

Por alguna razón validate: [ isEmail, 'Invalid email.'] no funciona bien con las pruebas 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.
}

Pero mangosta 4.x (también podría funcionar para versiones anteriores) tiene otras opciones alternativas que funcionan de la mano con las pruebas unitarias.

Validador único:

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

Múltiples validadores:

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

Cómo validar el correo electrónico:

Mi recomendación: Dejar eso a los expertos que han invertido cientos de horas en la construcción adecuada herramientas de validación. (ya contestado en aquí también)

npm install --save-dev validator

import { isEmail } from 'validator';
...
validate: { validator: isEmail , message: 'Invalid email.' }
 3
Author: zurfyx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:10

Tipo de correo electrónico para esquemas - mangosta-tipo-correo electrónico

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

var UserSchema = new mongoose.Schema({
    email: mongoose.SchemaTypes.Email
});
 0
Author: o.z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-09 16:02:57