programing

mongoose 2개 필드를 사용한 사용자 지정 유효성 검사

jooyons 2023. 5. 15. 21:39
반응형

mongoose 2개 필드를 사용한 사용자 지정 유효성 검사

mongoose 사용자 지정 유효성 검사를 사용하여 endDate가 startDate보다 큰지 확인하려고 합니다.startDate 값에 액세스하려면 어떻게 해야 합니까?.startDate를 사용하면 작동하지 않습니다. 정의되지 않았습니다.

var a = new Schema({
  startDate: Date,
  endDate: Date
});

var A = mongoose.model('A', a);

A.schema.path('endDate').validate(function (value) {
  return diff(this.startDate, value) >= 0;
}, 'End Date must be greater than Start Date');

diff는 두 날짜를 비교하는 함수입니다.

Mongoose를 사용하여 할 수 있습니다.'validate' 모든 필드에 액세스할 수 있는 미들웨어:

ASchema.pre('validate', function(next) {
    if (this.startDate > this.endDate) {
        next(new Error('End Date must be greater than Start Date'));
    } else {
        next();
    }
});

유효성 검사 오류 메시지를 JavaScript로 래핑해야 합니다.Error호출 시 이의 제기next유효성 검사 실패를 보고합니다.

원래 질문에 대한 허용된 답변에 대한 대안은 다음과 같습니다.

var mongoose = require('mongoose'),
  Schema = mongoose.Schema;

// schema definition
var ASchema = new Schema({
  startDate: {
    type: Date,
    required: true
  },
  endDate: {
    type: Date,
    required: true,
    validate: [dateValidator, 'Start Date must be less than End Date']
  }
});

// function that validate the startDate and endDate
function dateValidator(value) {
  // `this` is the mongoose document
  return this.startDate <= value;
}

저는 @JohnnyHK(감사합니다)의 확실한 답변에 대해 이것을 활용하여 확장하고 싶었습니다.invalidate:

Schema.pre('validate', function (next) {
  if (this.startDate > this.endDate) {
    this.invalidate('startDate', 'Start date must be less than end date.', this.startDate);
  }

  next();
});

이렇게 하면 모든 유효성 검사 오류가 몽구스 내부에 유지됩니다.Error.ValidationError 오류입니다.오류 처리기를 표준화된 상태로 유지하는 데 도움이 됩니다.이게 도움이 되길 바랍니다.

날짜 스탬프를 부모 개체에 중첩한 다음 부모의 유효성을 검사할 수 있습니다.예를 들어 다음과 같은 것이 있습니다.

//create a simple object defining your dates
var dateStampSchema = {
  startDate: {type:Date},
  endDate: {type:Date}
};

//validation function
function checkDates(value) {
   return value.endDate < value.startDate; 
}

//now pass in the dateStampSchema object as the type for a schema field
var schema = new Schema({
   dateInfo: {type:dateStampSchema, validate:checkDates}
});

검증자 내에서 '이것'을 사용하는 것이 나에게 효과적입니다. 이 경우 이메일 주소의 고유성을 확인할 때 현재 개체의 ID에 액세스해야 카운트에서 제외할 수 있습니다.

var userSchema = new mongoose.Schema({
  id: String,
  name: { type: String, required: true},
  email: {
    type: String,
    index: {
      unique: true, dropDups: true
    },
    validate: [
      { validator: validator.isEmail, msg: 'invalid email address'},
      { validator: isEmailUnique, msg: 'Email already exists'}
    ]},
  facebookId: String,
  googleId: String,
  admin: Boolean
});

function isEmailUnique(value, done) {
  if (value) {
    mongoose.models['users'].count({ _id: {'$ne': this._id }, email: value }, function (err, count) {
      if (err) {
        return done(err);
      }
      // If `count` is greater than zero, "invalidate"
      done(!count);
    });
  }
}

이것이 제가 사용한 솔루션입니다(힌트를 위해 @shakinfree 덕분입니다).

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

// schema definition
var ASchema = new Schema({
  dateSchema : {
                type:{
                    startDate:{type:Date, required: true}, 
                    endDate:{type:Date, required: true}
                }, 
                required: true, 
                validate: [dateValidator, 'Start Date must be less than End Date']
            }
});

// function that validate the startDate and endDate
function dateValidator (value) {
    return value.startDate <= value.endDate;
}

module.exports = mongoose.model('A', ASchema);

언급URL : https://stackoverflow.com/questions/23760253/mongoose-custom-validation-using-2-fields

반응형