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

Why isn't $data reference working in this example?

我已将 $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 并且所有这些都导致相同的有效!响应。

我期待一个无效的响应,其中包含一条关于 endDate 至少需要 startDate 的消息,但我得到了一个有效的!响应。

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

查看 运行 示例

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

在你的情况下,你想上升一次到 endDate,然后再上升到 properties;一共两次。然后你“进入”startDate,这是 forward-slash 进来的地方......

2/startDate

您可以阅读有关 JSON 指针如何在 this RFC 中工作的信息。

formatMinimum 不受基本 ajv 包的支持。 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));
}