【问题标题】:Custom (user-friendly) ValidatorError message自定义(用户友好)ValidatorError 消息
【发布时间】:2012-02-17 16:24:03
【问题描述】:

我真的是猫鼬的新手,所以我想知道是否有某种方法可以设置custom error message,而不是像Validator "required" failed for path password 这样的默认设置。

我想设置类似Password is required. 的东西,这样对用户更友好。

我编写了一些自定义验证器并使用此用户友好的错误消息设置type 属性,但我不确定type 是否是错误消息的正确占位符。也无法在 min, max, required, enum... 等预定义验证器上设置自定义消息

一种解决方案是每次检查type 抛出错误的属性并手动分配错误消息,但认为这是验证器的工作:

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

这显然不是理想的解决方案。

我查看了express-formnode-validator,但仍想使用猫鼬验证功能。

【问题讨论】:

  • 还有 express-validator 效果很好。

标签: node.js mongodb express error-handling mongoose


【解决方案1】:

我通常使用辅助函数来处理这些事情。只是嘲笑这个比我使用的更通用一点。这家伙将采用所有“默认”验证器(必需、最小值、最大值等)并使他们的消息更漂亮(根据下面的 messages 对象),并仅提取您在验证器中传递的消息用于自定义验证。

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);
}

而且可以这样使用(快速路由器示例):

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);
    }
}

之前:

{ 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' } } }

之后:

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

编辑:Snap,刚刚意识到这是一个 CoffeeScript 问题。不是 CoffeeScript 人,我真的不想用 CS 重写它。您总是可以将它作为 js 文件要求到您的 CS 中吗?

【讨论】:

  • 谢谢 :)。我已经分叉了猫鼬项目并认为解决了这个问题。我发送pull request 给猫鼬家伙。附言这根本不是 CoffeScript……我只是想写一些伪代码,但版主添加了 CoffeScript 标签:)
【解决方案2】:

如果您需要获取第一条错误消息,请参见以下示例:

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

问候,尼科尔斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多