programing

Mongoose 고유 유효성 검사 오류 유형

yellowcard 2023. 6. 19. 21:23
반응형

Mongoose 고유 유효성 검사 오류 유형

이 스키마를 사용하고 있습니다.mongoose 3.0.3npm에서:

var schema = new Schema({

    _id: Schema.ObjectId,
    email: {type: String, required: true, unique: true}

});

이미 DB에 있는 전자 메일을 저장하려고 하면 다음 메시지가 표시됩니다.ValidationError마치required필드가 생략되었습니다.하지만 이것은 사실이 아닙니다, 저는 이해합니다.MongoError: E11000 duplicate key error index.

유효성 검사 오류가 아닙니다(고유:true를 제거하더라도 발생).

왜 그런지 추측이라도?

경로 검증 메커니즘에 넣는 것을 선호합니다, 예를 들면

UserSchema.path('email').validate(function(value, done) {
    this.model('User').count({ email: value }, function(err, count) {
        if (err) {
            return done(err);
        } 
        // If `count` is greater than zero, "invalidate"
        done(!count);
    });
}, 'Email already exists');

그러면 그냥 포장이 될 겁니다.ValidationError그리고 당신이 전화할 때 첫 번째 주장으로 돌아올 것입니다.validate또는save.

저는 승인된 답변에 몇 가지 문제가 있었습니다.즉, 다음과 같습니다.

  1. this.model('User')나한텐 안 통했어요
  2. 콜백done제대로 작동하지 않았습니다.

이러한 문제를 해결한 방법은 다음과 같습니다.

  UserSchema.path('email').validate(async (value) => {
    const emailCount = await mongoose.models.User.countDocuments({email: value });
    return !emailCount;
  }, 'Email already exists');

사용합니다async/awaithttps://javascript.info/async-await 이 훨씬 더 깔끔하기 때문에 개인적인 선호입니다.

제가 뭔가 잘못하면 알려주세요.

예상된 동작입니다.

unique: true는 다음과 같이 mongodb에 인덱스를 설정하는 것과 같습니다.

db.myCollection.ensureIndex( { "email": 1 }, { unique: true } )

Mongoose를 사용하여 이러한 유형의 유효성 검사를 수행하려면(Mongoose는 이 복잡한 유효성 검사를 호출합니다. 예를 들어 값이 숫자라고만 주장하는 것은 아닙니다.) 저장 전 이벤트에 연결해야 합니다.

mySchema.pre("save",function(next, done) {
    var self = this;
    mongoose.models["User"].findOne({email : self.email},function(err, results) {
        if(err) {
            done(err);
        } else if(results) { //there was a result found, so the email address exists
            self.invalidate("email","email must be unique");
            done(new Error("email must be unique"));
        } else {
            done();
        }
    });
    next();
});

json에 대한 단순한 응답

try {
  let end_study_year = new EndStudyYear(req.body);
  await end_study_year.save();
   res.json({
    status: true,
    message: 'បានរក្សាទុក!'
   })
  }catch (e) {
   res.json({
   status: false,
   message: e.message.toString().includes('duplicate') ? 'ទិន្នន័យមានរួចហើយ' : e.message.split(':')[0] // check if duplicate message exist
  })
 }

오래된 질문에 대답해서 죄송합니다.테스트 후에 이 답들을 찾게 되어 기분이 좋으니 제 경험을 말씀드리겠습니다.두 가지 주요 답변 모두 훌륭하고 옳습니다. 다음 사항을 기억하십시오.

  • 문서가 새 문서인 경우 카운트가 0보다 높은지 여부를 확인할 수 있습니다. 이는 일반적인 상황입니다.
  • 문서가 새 것이 아니고 수정된 경우unique필드도 0으로 유효성을 검사해야 합니다.
  • 문서가 새 것이 아니고 수정되지 않은 경우에는 계속하십시오.

내 코드로 만든 것은 다음과 같습니다.

UserSchema.path('email').validate(async function validateDuplicatedEmail(value) {
    if (!this.isNew && !this.isModified('email')) return true;

    try {
        const User = mongoose.model("User");

        const count = await User.countDocuments({ email: value });
        if (count > 0) return false;

        return true;
    }
    catch (error) {
        return false;
    }
}, "Email already exists");


언급URL : https://stackoverflow.com/questions/13580589/mongoose-unique-validation-error-type

반응형