Почему в этом примере не работает ссылка на $ data? - PullRequest
1 голос
/ 19 июня 2019

Я установил для параметра $ data значение true, и я пытаюсь ограничить endDate как минимум значением startDate, используя выражение $ data. Этот пример должен пройти проверку, но это не так. (

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, но я получаю Valid! ответ.

Вы можете увидеть работающий пример на https://runkit.com/jcdietrich/5d0a45ced5afb8001c33808b

Ответы [ 2 ]

1 голос
/ 24 июня 2019

formatMinimum не поддерживается базовым пакетом ajv. обязательные ключевые слова ajv.

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));
}
0 голосов
/ 19 июня 2019

Первое число в Относительном указателе JSON - это количество уровней, которые нужно поднять. Вы можете думать об этом как о выполнении cd .. в терминале (вроде - читайте RFC, связанный ниже для фактической работы, поскольку точное поведение зависит от того, находитесь ли вы в массиве или объекте.)

В вашем случае вы хотите подняться один раз до endDate, а затем еще раз до properties; два раза в общей сложности. Затем вы «входите» в startDate, где начинается прямая косая черта ...

2/startDate

Вы можете прочитать о том, как работают Относительные указатели JSON в этом RFC .

...