この時点で、マングースがエラーを処理する方法に賛成するのは理にかなっているようです。
モデルがエラーメッセージを処理することは望ましくありません。プレゼンテーション層(コントローラー?)はtype
に依存する必要があります 表示するのに最適なユーザーフレンドリーなメッセージを決定します(i18nを考慮)。
ミドルウェアを使用して検証が行われる場合もあります。この場合、コントローラーに表示されるエラーメッセージは、next()
に渡すものです。 コールバック。
したがって、ミドルウェアの場合、文書化されていませんが、モデル全体で一貫した検証APIを維持するには、Mongooseのエラーコンストラクターを直接使用する必要があります。
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();
});
そうすれば、検証エラーがミドルウェアに起因する場合でも、一貫した検証エラー処理が保証されます。
エラーメッセージをタイプに適切に一致させるために、列挙型を作成します これは、考えられるすべてのタイプの静的マップとして機能します:
// 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);
}
});
});