为什么在此示例中$ data引用不起作用?

时间:2019-06-19 17:41:28

标签: javascript ajv

我已经将$ data选项设置为true,并且正在尝试使用$ data表达式将endDate限制为至少startDate的值。此示例应通过验证,但不会失败。 :(

var Ajv = require('ajv');
var ajv = new Ajv({allErrors: true, $data: true});

var schema = {
  "properties": {
    "filter": { "properties": {
        "startDate": { type: 'string', format:'date'},
        "endDate": { type: 'string', format:'date', formatMinimum: {'$data': '/filter/startDate'}}
  }}
}};

var validate = ajv.compile(schema);

test({filter: {startDate:'2008-09-01', endDate: '2004-09-01'}});

function test(data) {
  var valid = validate(data);
  if (valid) console.log('Valid!');
  else console.log('Invalid: ' + ajv.errorsText(validate.errors));
}

我尝试了各种JSON指针。.0/startDate 1/startDate和显示的/filter/startDate,所有这些都导致相同的Valid!响应。

我希望收到一个有关endDate消息的无效响应,该消息需要最少的startDate,但我得到了Valid!响应。

您可以在https://runkit.com/jcdietrich/5d0a45ced5afb8001c33808b

看到正在运行的示例

2 个答案:

答案 0 :(得分:1)

基本ajv软件包不支持

formatMinimum。必须输入ajv-keywords。

var Ajv = require('ajv');
var ajv = new Ajv({allErrors: true, $data: true});
require("ajv-keywords")(ajv)

var schema = {
  "properties": {
    "filter": { "properties": {
        "startDate": { type: 'string', format:'date'},
        "endDate": { type: 'string', format:'date', formatMinimum: {'$data': '/filter/startDate'}}
  }}
}};

var validate = ajv.compile(schema);

test({filter: {startDate:'2008-09-01', endDate: '2004-09-01'}});

function test(data) {
  var valid = validate(data);
  if (valid) console.log('Valid!');
  else console.log('Invalid: ' + ajv.errorsText(validate.errors));
}

答案 1 :(得分:0)

“相对JSON指针”中的第一个数字是“要升级的级别”的数量。您可以认为这是在终端中进行的cd ..(某种程度上,请阅读下面的RFC链接以了解实际的工作原理,因为确切的行为取决于您是在数组内还是在对象内。)

在您的情况下,您想上升到endDate,然后再上升到properties;总共两次。然后您“进入” startDate,这是正斜杠出现的地方...

2/startDate

您可以在this RFC中了解有关JSON相对指针的工作方式。