【问题标题】:SimpleSchema unable to set specific error message for given validationSimpleSchema 无法为给定的验证设置特定的错误消息
【发布时间】:2017-04-07 17:09:42
【问题描述】:

我有一个非常基本的模型,只有一个字段 name 我想针对正则表达式进行验证:

const Projects = new ProjectsCollection('projects');

Projects.schema = new SimpleSchema({
    _id         : {type: String, regEx: SimpleSchema.RegEx.Id},
    name        : {
        type : String,
        regEx: /^[a-zA-Z0-9]+((\s[a-zA-Z0-9]+)|(_[a-zA-Z0-9]+)|(-[a-zA-Z0-9]+)|(\.[a-zA-Z0-9]+))?$/
    }
});

Projects.attachSchema(Projects.schema);

当验证失败时,我会返回一个验证错误,指出 regex failed for Name 这对我来说是不可取的,因为它模棱两可并且用户不知道我究竟需要他输入什么。

我尝试添加以下内容但没有成功:

Projects.schema.messages({
    "regEx name": [{
        msg: "test error message"
    }]
});

然而,这个.. 有效,但问题是我可以有任何其他带有名称字段的模型,它会为所有这些模型吐出相同的错误消息(我计划有另一个带有 name 的模型字段):

SimpleSchema.messages({
    "regEx name": [{
        msg: "test error message"
    }]
});

我也试过了(没有成功):

SimpleSchema.messages({
    "regEx projects.name": [{
        msg: "test error message"
    }]
});

我通过方法插入,这是我的插入代码:

export const insert = new ValidatedMethod({
    name                  : 'projects.insert',
    mixins                : [simpleSchemaMixin],
    schema                : Projects.simpleSchema().pick([
        'name'
    ]),
    schemaValidatorOptions: {
        clean : true,
        filter: false
    },
    run({name}) {
        return Projects.insert({
            name
        }, null);
    },
});

关于我应该如何配置我的验证消息以便我可以针对特定字段定位它们的任何想法?

【问题讨论】:

    标签: meteor simple-schema


    【解决方案1】:

    请参阅the documentation 了解regex 消息的特殊情况:

    在你的情况下,你应该尝试:

    Projects.schema.messages({
      "regEx name": [
        {
          exp: /^[a-zA-Z0-9]+((\s[a-zA-Z0-9]+)|(_[a-zA-Z0-9]+)|(-[a-zA-Z0-9]+)|(\.[a-zA-Z0-9]+))?$/ , 
          msg: "test error message"
        }
      ]
    });
    

    【讨论】:

    • 不幸的是同样的一般错误:Name failed regular expression validation
    • 您是否在附加架构之前设置消息?
    • 我只是尝试了两者来确定。我怀疑ValidatedMethod 正在创建一个不使用我的消息的新架构。
    • 哦,是的,我认为你是对的。您只使用架构中 name 字段的定义,并且消息附加到上一级。
    【解决方案2】:

    这个答案和问题适用于meteor-simpl-schema v1

    我遇到了同样的问题,这对我有用。我认为自定义消息是基于实例的 - 仅绑定到一个 simplSchema 实例。然后在您的验证方法中,pick() 将创建一个新的 SimplSchema 实例,没有您的自定义消息。

    我需要从“父”模式手动添加自定义消息。 在你的情况下是这样的:

    const insertProjectSchema = Projects.schema.pick('name');
    insertProjectSchema.messages(Projects.schema._messages);
    
    export const insert = new ValidatedMethod({
        name                  : 'projects.insert',
        mixins                : [simpleSchemaMixin],
        schema                : insertProjectSchema,
        schemaValidatorOptions: {
            clean : true,
            filter: false
        },
        run({name}) {
            return Projects.insert({
                name
            }, null);
        },
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 2018-08-24
      • 2023-01-05
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多