Tại thời điểm này, có vẻ hợp lý khi xem xét cách mongoose xử lý lỗi.
Bạn sẽ không muốn các mô hình của mình xử lý các thông báo lỗi. Lớp trình bày (bộ điều khiển?) Nên dựa vào loại type
để quyết định xem đâu là thông báo thân thiện với người dùng nhất để hiển thị (i18n đã xem xét).
Cũng có trường hợp xác thực có thể xảy ra bằng cách sử dụng phần mềm trung gian. Trong trường hợp này, thông báo lỗi sẽ hiển thị trên bộ điều khiển của bạn là bất kỳ thứ gì bạn chuyển đến next()
gọi lại.
Vì vậy, đối với trường hợp phần mềm trung gian, mặc dù không được ghi lại, nhưng để giữ một API xác thực nhất quán trên các mô hình của bạn, bạn nên sử dụng trực tiếp các trình tạo Lỗi của 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();
});
Bằng cách đó, bạn được đảm bảo xử lý lỗi xác thực nhất quán ngay cả khi lỗi xác thực bắt nguồn từ phần mềm trung gian.
Để đối sánh chính xác các thông báo lỗi với các loại, tôi sẽ tạo một enum sẽ hoạt động như một bản đồ tĩnh cho tất cả các loại có thể có:
// 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);
}
});
});