Mongoose 고유 유효성 검사 오류 유형
이 스키마를 사용하고 있습니다.mongoose 3.0.3
npm에서:
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
.
저는 승인된 답변에 몇 가지 문제가 있었습니다.즉, 다음과 같습니다.
this.model('User')
나한텐 안 통했어요- 콜백
done
제대로 작동하지 않았습니다.
이러한 문제를 해결한 방법은 다음과 같습니다.
UserSchema.path('email').validate(async (value) => {
const emailCount = await mongoose.models.User.countDocuments({email: value });
return !emailCount;
}, 'Email already exists');
사용합니다async/await
https://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
'programing' 카테고리의 다른 글
I 컨트롤 핫픽스의 Mongo 오류 (0) | 2023.06.24 |
---|---|
OpenPyXl을 사용하여 Excel 워크북의 값 범위를 지우는 방법 (0) | 2023.06.24 |
생성자 직후에 NullReferenceException 오류가 발생한 이유는 무엇입니까? (0) | 2023.06.19 |
CreateReactApp 및 TypeScript로 선택적 체인을 활성화하는 방법 (0) | 2023.06.19 |
Spring Boot 2.3.0 빌드 팩은 생성 날짜가 40년 전인 이미지를 빌드합니다. (0) | 2023.06.19 |