node.js - tutorial - Mongoose: valida la sintaxis del correo electrónico
para que se usa elastic search (6)
El validador no puede jugar bien con la mangosta para deshacerse del conjunto de advertencia isAsync to false
const validator = require(''validator'');
email:{
type:String,
validate:{
validator: validator.isEmail,
message: ''{VALUE} is not a valid email'',
isAsync: false
}
}
Tengo un esquema de mangosta para los 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 verifica si el campo está vacío o no, y no para la sintaxis.
¿Ya existe algo que pueda volver a usar o tendré que idear mi propio método y llamarlo dentro de la función de validación?
Por alguna razón, no funciona bien con las pruebas 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.
}
Pero mongoose 4.x (también podría funcionar para versiones anteriores) tiene otras opciones alternativas que funcionan de la mano con las pruebas unitarias.
Validador simple:
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: deje eso a los expertos que han invertido cientos de horas en la creación de herramientas de validación adecuadas. (ya respondió here también)
npm install --save-dev validator
import { isEmail } from ''validator'';
...
validate: { validator: isEmail , message: ''Invalid email.'' }
Puedes usar una expresión regular. Echa un vistazo a esta pregunta: ¿ Validar la dirección de correo electrónico en JavaScript?
Lo he usado 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.'')
Tipo de correo electrónico para esquemas - mongoose-type-email
var mongoose = require(''mongoose'');
require(''mongoose-type-email'');
var UserSchema = new mongoose.Schema({
email: mongoose.SchemaTypes.Email
});
Utilizo el validator para mi sanidad de entrada, y puede usarse de una manera muy buena.
Instálalo y luego úsalo así:
import { isEmail } from ''validator'';
// ...
const EmailSchema = new Schema({
email: {
//... other setup
validate: [ isEmail, ''invalid email'' ]
}
});
funciona un placer, y se lee muy bien.
también podría usar la coincidencia o la propiedad de validación 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'']
}
});