2012-11-27 18 views
15

मैं NPM से mongoose 3.0.3 के साथ इस स्कीमा उपयोग कर रहा हूँ:नेवला अद्वितीय सत्यापन त्रुटि प्रकार

var schema = new Schema({ 

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

}); 

अगर मैं एक ईमेल DB में है कि पहले से ही बचाने की कोशिश, मैं एक ValidationError की तरह अगर एक required क्षेत्र प्राप्त करने की उम्मीद छोड़ा गया है हालांकि यह मामला नहीं है, मुझे MongoError: E11000 duplicate key error index मिलता है।

जो सत्यापन त्रुटि नहीं है (तब भी होता है जब मैं अद्वितीय को हटा देता हूं: सत्य)।

कोई विचार क्यों?

+2

साइड नोट: 'नवीनतम एनपीएम मोंगोज़ 'सप्ताह/महीने/वर्ष में व्यर्थ हो सकता है। आप जिस संस्करण का उपयोग कर रहे हैं उसे रखें। – freakish

+2

यह अद्वितीय होने के बाद भी यह कर रहा है: सच है क्योंकि एलेक्सजेम्सब्रॉउन ने कहा, यह विनिर्देश आपके डीबी पर एक इंडेक्स बनाता है। जब तक आप इंडेक्स या डीबी ड्रॉप नहीं करते हैं तब तक डीबी और इंडेक्स जारी रहता है। आप शायद पहले ही इसे समझ चुके हैं, लेकिन मुझे लगता है कि यह किसी के लिए सहायक हो सकता है। – juanpaco

उत्तर

21

मैं इसे डालना पसंद करता हूं n पथ सत्यापन तंत्र, जैसे

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 कहते हैं।

+0

यह सही उत्तर है। यह पथ के लिए एक कस्टम सत्यापनकर्ता होना चाहिए, पूर्व-सहेजने वाला फ़ंक्शन नहीं। – user3344977

+1

यह काम करता है लेकिन इसका उपयोग करते हुए। मॉडल कुछ परिदृश्यों में एक त्रुटि फेंक सकता है जब यह मॉडल के दस्तावेज़/उदाहरण का संदर्भ नहीं देता है, बल्कि वास्तविक मॉडल भी। सभी परिदृश्यों को संभालने और त्रुटि को फेंकने से बचने का सुरक्षित तरीका mongoose.model ('user', UserSchema) का उपयोग करना है। – user3344977

+0

यह मेरे लिए काम करता है, धन्यवाद। –

10

यह व्यवहार की उम्मीद है

unique: true इस तरह MongoDB में एक सूचकांक की स्थापना के बराबर है: (नेवला आप अर्थात् इस जटिल validation- कॉल

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

सत्यापन के इस प्रकार नेवला का उपयोग कर ऐसा करने के लिए केवल मूल्य को ज़ोर देना नहीं है उदाहरण के लिए), आपको प्री-सेव इवेंट में वायरस करने की आवश्यकता होगी:

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(); 
}); 
+0

अपनी विधि का प्रयास किया लेकिन एक और समस्या का सामना करना पड़ा: http://stackoverflow.com/questions/13582862/mongoose-pre-save-async-middleware-not-working-as-expected – Olivier

संबंधित मुद्दे