Ajv关键字和自定义错误消息

时间:2017-12-04 11:48:37

标签: javascript ajv

我已经编写了一个模式,但似乎并没有像我期望的那样进行验证。我假设我的架构语法有问题,但无法弄明白。我希望在筹款活动完成之前不会看到标题或目标的错误消息,因为只有在筹款人完成后才需要这些消息。我尝试了很多种组合,但没有一种能按预期工作,这两种组合最接近我所需要的。

架构尝试一次:显示4条错误消息,3条必填错误和1条错误,说明数据应该匹配"然后"架构。

const schema = {
  required: ['fundraiser'],
  if: {
    properties: {
      fundraiser: { type: 'string' },
    },
  },
  then: {
    required: ['title', 'target'],
  },
  errorMessage: {
    required: {
      fundraiser: 'Please select an option',
      title: 'Please enter a title',
      target: 'Please enter a target',
    },
  },
};

架构尝试两次:显示2条错误消息,1条所需错误和1条错误,说明数据应该匹配"然后"架构是正确的,但是当我完成募捐活动时,有效会变为真,这时我希望看到标题和目标所需的错误。此外,没有错误包含我定义的自定义错误消息。

const scema = {
  if: {
    properties: { fundraiser: { minLength: 2 } },
    then: { required: ['title', 'target'] },
  },
  then: { required: ['fundraiser'] },
  errorMessage: {
    required: {
      fundraiser: 'Please select an option',
      title: 'Please enter a title',
      target: 'Please enter a target',
    },
  },
};

我很确定我的架构出错了但是从文档中不清楚if / then如何结合使用ajv-errors的自定义错误消息。任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

第一个模式的问题是“if”内的子模式是有效的,除非存在筹款人属性而不是字符串。如果您将type: 'object'添加到根模式并将required移到“if”子模式中,它可能会按预期工作。

第二个子模式的问题是忽略了同一个模式对象中没有“if”的第一个“then”(除非你使用ajv-keywords,实现if / then / else与它的实现方式有些不同) JSON Schema规范草案07中定义的子模式和“即使筹款人财产不存在也是有效的,而第二个”那么“只有在筹款人在场时才能通过。”