इस बिंदु पर यह खरीदना तर्कसंगत लगता है कि कैसे नेवला त्रुटियों को संभालता है।
आप नहीं चाहेंगे कि आपके मॉडल त्रुटि संदेशों को संभालें। प्रस्तुति परत (नियंत्रक?) को type
. पर निर्भर होना चाहिए यह तय करने के लिए कि प्रदर्शित करने के लिए सबसे अच्छा उपयोगकर्ता-अनुकूल संदेश कौन सा है (i18n माना जाता है)।
ऐसे मामले भी हैं जहां मिडलवेयर का उपयोग करके सत्यापन हो सकता है। इस मामले में, त्रुटि संदेश जो आपके नियंत्रक के सामने आएगा वह वही है जो आप next()
को पास करते हैं कॉलबैक।
इसलिए, मिडलवेयर के मामले में, हालांकि दस्तावेज नहीं है, अपने मॉडलों में एक सुसंगत सत्यापन एपीआई रखने के लिए आपको सीधे मोंगोज़ के त्रुटि कंस्ट्रक्टर्स का उपयोग करना चाहिए:
var mongoose = require('mongoose');
var ValidationError = mongoose.Error.ValidationError;
var ValidatorError = mongoose.Error.ValidatorError;
schema.pre('save', function (next) {
if (/someregex/i.test(this.email)) {
var error = new ValidationError(this);
error.errors.email = new ValidatorError('email', 'Email is not valid', 'notvalid', this.email);
return next(error);
}
next();
});
इस तरह आपको एक सुसंगत सत्यापन त्रुटि प्रबंधन की गारंटी दी जाती है, भले ही सत्यापन त्रुटि किसी मिडलवेयर से उत्पन्न हो।
त्रुटि संदेशों का ठीक प्रकार से मिलान करने के लिए मैं एक enum . बनाऊंगा जो सभी संभावित प्रकारों के लिए एक स्थिर मानचित्र के रूप में कार्य करेगा:
// my controller.js
var ValidationErrors = {
REQUIRED: 'required',
NOTVALID: 'notvalid',
/* ... */
};
app.post('/register', function(req, res){
var user = new userModel.Model(req.body);
user.save(function(err){
if (err) {
var errMessage = '';
// go through all the errors...
for (var errName in err.errors) {
switch(err.errors[errName].type) {
case ValidationErrors.REQUIRED:
errMessage = i18n('Field is required');
break;
case ValidationErrors.NOTVALID:
errMessage = i18n('Field is not valid');
break;
}
}
res.send(errMessage);
}
});
});