programing

Mongoose - 전자 메일 구문의 유효성 검사

padding 2023. 5. 23. 21:37
반응형

Mongoose - 전자 메일 구문의 유효성 검사

사용자용 몽구스 스키마(UserSchema)가 있는데 이메일의 구문이 올바른지 확인하고 싶습니다.현재 사용하고 있는 유효성 검사는 다음과 같습니다.

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

그러나 이것은 필드가 비어 있는지 여부만 확인하고 구문은 확인하지 않습니다.

재사용할 수 있는 것이 이미 존재합니까? 아니면 제 나름의 방법을 생각해내고 유효성 검사 기능 안에서 호출해야 합니까?

스키마에서 유효성 검사를 위해 일치 또는 유효성 검사 속성을 사용할 수도 있습니다.

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']
    }
});

저는 입력 위생을 위해 검증기를 사용합니다. 그리고 그것은 꽤 멋진 방식으로 사용될 수 있습니다.

설치한 다음 다음과 같이 사용합니다.

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

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

효과가 좋고, 잘 읽습니다.

정규식을 사용할 수 있습니다.질문을 보십시오. 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.')

확인자가 mongoose를 사용하여 경고 집합을 제거할 수 없음: Async to false

const validator = require('validator');

email:{
type:String,
validate:{
      validator: validator.isEmail,
      message: '{VALUE} is not a valid email',
      isAsync: false
    }
}

오래된 솔루션인 것은 알지만, 이 솔루션이 보이지 않기 때문에 다음 사항을 공유하고자 합니다.

const schema = new mongoose.Schema({
    email: {
        type: String,
        trim: true,
        lowercase: true,
        unique: true,
        validate: {
            validator: function(v) {
                return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(v);
            },
            message: "Please enter a valid email"
        },
        required: [true, "Email required"]
    }
});

유효성을 검사할 모든 유형에 대해 이 작업을 수행하고 적절한 정규식을 전달할 수 있습니다.유효성을 검사할 유형과 관련 정규식을 검색하면 해결 방법을 쉽게 찾을 수 있습니다.이렇게 하면 유효성 검사를 일관되게 유지하고 함수를 중단하는 대신 스키마에 모든 코드를 넣습니다.

웬일인지 그래. 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.' },
  ],
},

이메일 유효성 확인 방법:

추천합니다.적절한 검증 도구를 구축하는 데 수백 시간을 투자한 전문가들에게 맡겨 주십시오. (여기서도 이미 답변 완료)

npm install --save-dev validator

import { isEmail } from 'validator';
...
validate: { validator: isEmail , message: 'Invalid email.' }

스키마의 전자 메일 유형 - mongoose-type-email

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

var UserSchema = new mongoose.Schema({
    email: mongoose.SchemaTypes.Email
});

가능한 참조:

const mongoose = require("mongoose");

const validateEmail = function(email) {
  const regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
  return regex.test(email);
};

const userSchema = new mongoose.Schema({
  email: {
    type: String,
    required: [true, "Please enter your email"],
    validate: [validateEmail, "Please enter a valid email"],
    unique: true,
  },


module.exports = mongoose.model("User", userSchema);
email: {
    type: String,
    match: [/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[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'
    }
  }
  • 호출된 npm 패키지 사용validator이메일뿐만 아니라 많은 검증을 즉시 제공할 수 있습니다.

  • 사용하다validate두 개의 중첩된 속성을 사용하는 전자 메일 필드의 스키마에 있는 속성 -validator (Function)그리고 amessageValidator 기능은 첫 단계에서 설치한 npm 패키지를 사용하는 기능입니다.

코드

npm install validator

스키마 정의

const mongoose = require('mongoose')
const validatorPackage = require('validator')

const UserSchema = new mongoose.Schema({
      .......
    
      email: {
        type: String,
        unique: true,
        required: [true, 'Email address is required'],
        validate: {
          validator: validatorPackage.isEmail,
          message: 'Please provide a valid email',
        },
      },
      .......
      
})

const model = mongoose.model('User', UserSchema)

module.exports = model

언급URL : https://stackoverflow.com/questions/18022365/mongoose-validate-email-syntax

반응형