Mongoose - проверка синтаксиса электронной почты
У меня есть схема mongoose для пользователей (UserSchema), и я хотел бы проверить, имеет ли текст правильный синтаксис. Валидация, которую я сейчас использую, следующая:
UserSchema.path('email').validate(function (email) {
return email.length
}, 'The e-mail field cannot be empty.')
Однако это только проверяет, пусто ли это поле или нет, а не для синтаксиса.
Есть ли что-то уже существующее, что я мог бы повторно использовать, или мне придется придумать мой собственный метод и вызвать его внутри функции проверки?
Ответы
Ответ 1
Вы можете использовать регулярное выражение. Взгляните на этот вопрос: Подтвердите адрес электронной почты в JavaScript?
Я использовал это в прошлом.
UserSchema.path('email').validate(function (email) {
var emailRegex = /^([\w-\.][email protected]([\w-]+\.)+[\w-]{2,4})?$/;
return emailRegex.test(email.text); // Assuming email has a text attribute
}, 'The e-mail field cannot be empty.')
Ответ 2
вы также можете использовать свойство match или validate для проверки в схеме
Пример
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']
}
});
Ответ 3
Я использую validator для моей санитарии ввода, и его можно использовать довольно круто.
Установите его, а затем используйте его так:
import { isEmail } from 'validator';
// ...
const EmailSchema = new Schema({
email: {
//... other setup
validate: [ isEmail, 'invalid email' ]
}
});
работает с удовольствием и прекрасно читает.
Ответ 4
Валидатор плохо работает с mongoose, чтобы избавиться от установленного isAsync предупреждения в false
const validator = require('validator');
email:{
type:String,
validate:{
validator: validator.isEmail,
message: '{VALUE} is not a valid email',
isAsync: false
}
}
Ответ 5
По какой-то причине 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 === '[email protected]';
},
message: 'Invalid email.',
},
},
Несколько валидаторов:
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.' },
],
},
Как проверить электронную почту:
Моя рекомендация: Оставьте это экспертам, которые вложили сотни часов в создание правильных инструментов проверки. (уже ответил в здесь)
npm install --save-dev validator
import { isEmail } from 'validator';
...
validate: { validator: isEmail , message: 'Invalid email.' }
Ответ 6
Тип электронной почты для схем - mongoose-type-email
var mongoose = require('mongoose');
require('mongoose-type-email');
var UserSchema = new mongoose.Schema({
email: mongoose.SchemaTypes.Email
});
Ответ 7
Я сделал this, который определяет настраиваемый тип поля в комплекте с проверкой подлинности электронной почты.
Ответ 8
email: {
type: String,
match: [/^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[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'
}
}
Ответ 9
Я совершенно новичок в мангусте, поэтому эти вопросы могут показаться глупыми. Есть ли способ передать опции isEmail в моей схеме mongoose?
const Schema = new Schema({
// some other fields..
email: {type: String, require: true, validate:[isEmail, 'invalid email provided']}
// ...
})
Потому что, насколько я понимаю, функция validate берет строку из 'email' и передает ее в качестве аргумента isEmail