복붙노트

[MONGODB] 이 개 필드를 사용하여 몽구스 지정 유효성 검사

MONGODB

이 개 필드를 사용하여 몽구스 지정 유효성 검사

나는 endDate가이 startDate를보다 큰 경우 확인하려면 몽구스 지정 유효성 검사를 사용하고 싶습니다. 어떻게 startDate를 값을 액세스 할 수 있습니까? this.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');

사랑하는 두 날짜를 비교하는 기능입니다.

해결법

  1. ==============================

    1.당신은 부모 개체에 날짜 스탬프를 중첩 시도하고 부모를 확인할 수 있습니다. 같은 예를 들어 뭔가 :

    당신은 부모 개체에 날짜 스탬프를 중첩 시도하고 부모를 확인할 수 있습니다. 같은 예를 들어 뭔가 :

    //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}
    });
    
  2. ==============================

    2.당신은 몽구스 '검증'을 사용하면 모든 필드에 액세스 할 수 있도록 미들웨어 것을 할 수 있습니다 :

    당신은 몽구스 '검증'을 사용하면 모든 필드에 액세스 할 수 있도록 미들웨어 것을 할 수 있습니다 :

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

    검증 실패를보고 옆에 호출 할 때 자바 스크립트 오류 개체에서 유효성 검사 오류 메시지를 포장해야합니다.

  3. ==============================

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

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

    var에 몽구스 =은 ( '몽구스')를 필요   스키마 mongoose.Schema를 =; // 스키마 정의 var에 ASchema 새로운 스키마 ({=   STARTDATE : {     입력 : 날짜,     필수 : 사실   },   종료 날짜 : {     입력 : 날짜,     필수 : 사실,     유효성 검사 : [나 DateValidator, '시작 날짜는 덜 종료 날짜보다 길어야']   } }); // STARTDATE를 및 검증 기능 endDate가 함수 나 DateValidator (값) {   //`this`은 몽구스 문서입니다   창 this.startDate <= 값; }

  4. ==============================

    4.나는 this.invalidate을 활용하여 @JohnnyHK (감사합니다)에서 고체 대답에 확장하고 싶었 :

    나는 this.invalidate을 활용하여 @JohnnyHK (감사합니다)에서 고체 대답에 확장하고 싶었 :

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

    이것은 mongoose.Error.ValidationError 오류 내부의 유효성 검사 오류를 모두 유지합니다. 표준화 된 오류 처리기를 유지하는 데 도움이됩니다. 희망이 도움이됩니다.

  5. ==============================

    5.발리에서 '이'를 사용하는 것은 나를 위해 작동 -이 경우에 나는 내가 계산에서 제외 할 수 있도록 현재 오브젝트의 ID에 액세스해야하는 이메일 주소의 고유성을 검사 할 때 :

    발리에서 '이'를 사용하는 것은 나를 위해 작동 -이 경우에 나는 내가 계산에서 제외 할 수 있도록 현재 오브젝트의 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);
        });
      }
    }
    
  6. ==============================

    6.이것은 (힌트에 대한 @shakinfree 덕분에) 사용되는 솔루션 I입니다 :

    이것은 (힌트에 대한 @shakinfree 덕분에) 사용되는 솔루션 I입니다 :

    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);
    
  7. from https://stackoverflow.com/questions/23760253/mongoose-custom-validation-using-2-fields by cc-by-sa and MIT license