2

TLDR:我需要自定义 JSON 表单提供的默认错误消息。例如,如果字段是requiredJSON 形式,则给出错误is a required property,我希望它返回错误消息文本,例如Invalid input....

我创建了一个带有类似模式的JSON 表单

    {
    type: 'object',
    properties: {
        name: {
            type: 'string',
            minLength: 3,
        },
    },
    required: [
        'name',
    ],
    errorMessage: {
        required: 'INVALID INPUT. This is a required field',
    },
};

现在我使用了这个模式和一个 UI 模式来创建一个 JSON 表单

const ajv = createAjv();
require('ajv-keywords')(ajv);
require('ajv-errors')(ajv);
<JsonForms
    schema={schema}
    uischema={uischema}
    data={data}
    renderers={CustomRenderers}
    cells={vanillaCells}
    onChange={onChange}
    ajv={ajv}
/>

上面的 JSON 表单呈现一个 UI 表单,当字段为空时会给出标准错误消息,例如is a required property,现在我需要用我自己的自定义消息覆盖,为此目的https://github.com/ajv-validator/ajv-errors发现errorMessage在我的模式中有用并添加了属性,required键具有我的自定义消息,我也require('ajv-errors')(ajv);根据需要添加了它,但我仍然收到默认错误消息,而不是我用 in 覆盖的错误消息errorMessage

我在这里错过了什么吗?或者我可以通过其他方式覆盖默认消息。此外,required我还将进行很多验证minLength,例如maxLength等,我可能必须覆盖其默认消息。

此外,我期待架构中有很多其他属性,因此添加errorMessage每个属性可能不是很有效,但如果这是我必须采用的唯一解决方案:)

4

2 回答 2

2

我继续添加我自己的自定义关键字

export default (ajv) => {
    ajv.addKeyword('customErrorMessages', {
        inline: generate_customErrorMessages,
        statements: true,
        valid: true,
        errors: 'full',
    });
    return ajv;
};

const generate_customErrorMessages = () => {
    var out = ' ';
    out += "vErrors = vErrors.map((v) => {"
    out += "if (v.keyword === 'required') {v.message = 'This field cannot be left blank.';} ";
    out += "else if (v.keyword === 'minLength') {v.message = `This field cannot be shorter than ${v.params?.limit} characters.`;} ";
    out += "else if (v.keyword === 'maxLength') {v.message = `This field cannot be longer than ${v.params?.limit} characters.`;} ";
    out += "else if (v.keyword === 'maximum') {v.message = `This field should be ${v.params?.comparison} ${v.params?.limit}`;} ";
    out += "else if (v.keyword === 'minimum') {v.message = `This field should be ${v.params?.comparison} ${v.params?.limit}`;}";
    out += "return v;});"
    return out;
};

我还需要在我的架构中添加关键字作为 "customErrorMessages": true. 有了这个,我的消息将成为代码的一部分而不是模式,我还可以为不同的语言添加不同的消息,而不必依赖于模式。

于 2020-12-16T06:54:36.613 回答
0
 {
type: 'object',
properties: {
    name: {
        type: 'string',
        minLength: 3,
    },
},
required: [
    'name',
],
"errorMessage": {
    "properties":{
           "name": 'INVALID INPUT. This is a required field'
      }
  
},

};

在 errorMessage 属性中,您应该在这种情况下提供属性“名称”以及您需要的自定义消息

于 2021-09-06T11:21:18.373 回答