2012-01-24 26 views
11

Tôi thực sự mới với mongoose, vì vậy tôi đã tự hỏi nếu có một số cách để thiết lập custom error message thay vì mặc định một như Validator "required" failed for path password.Thông báo ValidatorError tùy chỉnh (thân thiện với người dùng)

Tôi muốn đặt một cái gì đó như Password is required. thân thiện với người dùng hơn.

Tôi đã viết một số trình xác thực tùy chỉnh và đặt thuộc tính type với thông báo lỗi thân thiện với người dùng này, nhưng tôi không chắc chắn type là trình giữ chỗ phù hợp cho thông báo lỗi. cũng không có cách nào để thiết lập thông báo tùy chỉnh trên trình xác nhận xác định trước như min, max, required, enum...

Một giải pháp là để kiểm tra mỗi khi type tài sản của lỗi ném và tự gán thông báo lỗi, nhưng nghĩ đó là công việc validator của:

save model 
    if error 
     check error type (eg. "required") 
     assign fancy error message (eg. "Password is required.") 

này rõ ràng không phải là giải pháp lý tưởng.

Tôi đã xem express-formnode-validator nhưng vẫn muốn sử dụng tính năng xác thực mongoose.

+0

Cũng ấy bày tỏ-validator mà hoạt động tốt. – chovy

Trả lời

16

Tôi thường sử dụng chức năng trợ giúp cho những thứ như vậy. Chỉ cần chế giễu cái này lên một chút tổng quát hơn cái mà tôi sử dụng. Anh chàng này sẽ nhận tất cả các trình xác nhận "mặc định" (yêu cầu, tối thiểu, tối đa, v.v.) và làm cho thông điệp của họ đẹp hơn một chút (theo đối tượng messages bên dưới), và chỉ trích xuất thông báo mà bạn đã thông qua trong trình duyệt tính hợp lệ của bạn xác thực.

function errorHelper(err, cb) { 
    //If it isn't a mongoose-validation error, just throw it. 
    if (err.name !== 'ValidationError') return cb(err); 
    var messages = { 
     'required': "%s is required.", 
     'min': "%s below minimum.", 
     'max': "%s above maximum.", 
     'enum': "%s not an allowed value." 
    }; 

    //A validationerror can contain more than one error. 
    var errors = []; 

    //Loop over the errors object of the Validation Error 
    Object.keys(err.errors).forEach(function (field) { 
     var eObj = err.errors[field]; 

     //If we don't have a message for `type`, just push the error through 
     if (!messages.hasOwnProperty(eObj.type)) errors.push(eObj.type); 

     //Otherwise, use util.format to format the message, and passing the path 
     else errors.push(require('util').format(messages[eObj.type], eObj.path)); 
    }); 

    return cb(errors); 
} 

Và nó có thể được sử dụng như thế này (thể hiện ví dụ router):

function (req, res, next) { 
    //generate `user` here 
    user.save(function (err) { 
     //If we have an error, call the helper, return, and pass it `next` 
     //to pass the "user-friendly" errors to 
     if (err) return errorHelper(err, next); 
    } 
} 

Trước:

{ message: 'Validation failed', 
    name: 'ValidationError', 
    errors: 
    { username: 
     { message: 'Validator "required" failed for path username', 
     name: 'ValidatorError', 
     path: 'username', 
     type: 'required' }, 
    state: 
     { message: 'Validator "enum" failed for path state', 
     name: 'ValidatorError', 
     path: 'state', 
     type: 'enum' }, 
    email: 
     { message: 'Validator "custom validator here" failed for path email', 
     name: 'ValidatorError', 
     path: 'email', 
     type: 'custom validator here' }, 
    age: 
     { message: 'Validator "min" failed for path age', 
     name: 'ValidatorError', 
     path: 'age', 
     type: 'min' } } } 

Sau:

[ 'username is required.', 
    'state not an allowed value.', 
    'custom validator here', 
    'age below minimum.' ] 

Sửa: Snap, chỉ nhận ra đây là một câu hỏi CoffeeScript. Không phải là một anh chàng CoffeeScript, tôi sẽ không thực sự muốn viết lại điều này trong CS. Bạn luôn có thể yêu cầu nó dưới dạng tệp js vào CS của bạn?

+0

Cảm ơn người đàn ông :). Tôi đã ngã ba dự án mongoose và suy nghĩ giải quyết điều này. Tôi gửi [pull request] (https://github.com/LearnBoost/mongoose/pull/753) cho những người mongoose. P.S. Đây không phải là CoffeScript ở tất cả ... Tôi chỉ muốn viết một số mã giả nhưng moderator thêm thẻ CoffeScript :) – ManInTheBox

+0

Awesome nhờ người đàn ông – Unitech

0

Nếu bạn cần nhận được thông báo lỗi đầu tiên, xem ví dụ sau:

var firstError = err.errors[Object.keys(err.errors)[0]]; 
return res.status(500).send(firstError.message); 

Kính trọng, Nicholls

Các vấn đề liên quan