2012-11-27 13 views
19

से ऊपर के बाद की उम्मीद: मैं NPM से mongoose 3.0.3 के साथ इस स्कीमा का उपयोग कर रहा Mongoose unique validation error typeनेवला pre.save() async मिडलवेयर काम नहीं कर के रूप में

:

var schema = new Schema({ 

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

}); 

इस मिडलवेयर के साथ से एक validationError पाने के लिए अद्वितीय: सही

schema.pre("save", function(next, done) { 
    var self = this; 

    model.findOne({email : this.email}, 'email', function(err, results) { 
     if(err) { 
      done(err); 
     } else if(results) { 
      console.warn('results', results); 
      self.invalidate("email", "email must be unique"); 
      done(new Error("email must be unique")); 
     } else { 
      done(); 
     } 
    }); 

    next(); 
}); 

हालांकि, यह काम नहीं करता है!

Users.create() अभी भी MongoError: E11000 duplicate key error index और console.warn() वापस लौटाएगा इसके बाद ही उसे कॉल किया जाएगा।

सहेजने की कार्रवाई तब तक नहीं की जानी चाहिए जब तक कि सभी मिडलवेयर done() को दस्तावेज़ों के अनुसार बुलाया नहीं गया है, और मुझे एक सत्यापन त्रुटि वापस लेनी चाहिए।

ऐसा लगता है कि done() व्यवहार की तरह अपेक्षित ढंग से काम नहीं कर रहा है,

किसी भी विचार क्यों?

उत्तर

37

आप एक समानांतर मिडलवेयर कॉलबैक फ़ंक्शन (दोनों next और done के साथ) का उपयोग कर रहे हैं, लेकिन आप schema.pre मानकों में समानांतर ध्वज की स्थापना नहीं कर रहे हैं तो यह धारावाहिक नियमों का उपयोग कर रहा है। कि अगर सब है

schema.pre("save", true, function(next, done) { ... 

या एक सीरियल मिडलवेयर कॉलबैक शैली करने के लिए स्विच तुम वैसे भी जरूरत है::

तो या तो अपने कॉल में समानांतर ध्वज शामिल

schema.pre("save", function(next) { 
    var self = this; 

    model.findOne({email : this.email}, 'email', function(err, results) { 
     if(err) { 
      next(err); 
     } else if(results) { 
      console.warn('results', results); 
      self.invalidate("email", "email must be unique"); 
      next(new Error("email must be unique")); 
     } else { 
      next(); 
     } 
    }); 
}); 
+0

नेवला किस संस्करण इस पर लागू होता है ? मुझे आपके कोड स्निपेट में उपयोग किए जा रहे 'schema.pre' के लिए इस समांतर हस्ताक्षर पर कोई दस्तावेज़ नहीं मिल रहा है। –

+1

@ पीटर लियोन समानांतर विकल्प कम से कम 2.x के आसपास रहा है। दस्तावेज़ों के लिए http://mongoosejs.com/docs/middleware.html देखें। – JohnnyHK

+0

@ जॉनीनीएचके क्या मैं अगले() में स्टेटस कोड भेज सकता हूं? अगर मैं अनुरोध को अस्वीकार करना चाहता हूं, तो डेटाबेस में अनुरोध सहेज नहीं है, और एक स्टेटस कोड भेजना है? क्या यह संभव है? – nirvair