Подтвердить что ты не робот

Mongoose - проверка синтаксиса электронной почты

У меня есть схема mongoose для пользователей (UserSchema), и я хотел бы проверить, имеет ли текст правильный синтаксис. Валидация, которую я сейчас использую, следующая:

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

Однако это только проверяет, пусто ли это поле или нет, а не для синтаксиса.

Есть ли что-то уже существующее, что я мог бы повторно использовать, или мне придется придумать мой собственный метод и вызвать его внутри функции проверки?

4b9b3361

Ответ 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