Я нашел решение, используя специальные ключевые слова Ajv для разработки следующей схемы:
{ "type": "array"
, "items": { "type": "string" }
, "minItems": 1
, "maxCombinedLength": 50
}
Уловка состоит в том, чтобы добавить поддержку maxCombinedLength
в Ajv:
ajv.addKeyword("maxCombinedLength", {
validate: (schema, data) => {
return data.reduce((l, s) => l + s.length, 0) <= schema;
}
});
Где:
ajv
является экземпляром Ajv
schema
is 50
data
- массив shipping_address
ДЕМО
const validate =
ajv.compile({ type: 'array'
, items: { type: 'string' }
, minItems: 1
, maxCombinedLength: 50
});
console.log(
validate([]));
// false (need at least one item)
console.log(
validate([ "address line 1"
, "address line 2"
, "address line 3"
]));
// true
console.log(
validate([ "address line 1"
, "address line 2"
, "address line 3"
, "address line 4"
, "address line 5"
, "address line 6"
, "address line 7"
, "address line 8"
])
, validate.errors);
// false (maxCombinedLength not satisfied!)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/6.12.0/ajv.min.js"></script>
<script>
const ajv = new Ajv;
ajv.addKeyword("maxCombinedLength", {
validate: (schema, data, parent_schema) => {
return data.reduce((l, s) => l + s.length, 0) <= schema;
}
});
</script>
ПРИЛОЖЕНИЕ: Как игнорировать нестроковые массивы?
Очевидно, что мы не можем использовать maxCombinedLength
, например, с массивом объектов.
К счастью, Ajv позволяет нам получить доступ к родительской схеме:
ajv.addKeyword("maxCombinedLength", {
validate: (schema, data, parent_schema) => {
if (parent_schema.items.type === 'string') {
return data.reduce((l, s) => l + s.length, 0) <= schema;
} else {
return true;
}
}
});
Итак, со следующей схемой:
{ "type": "array"
, "items": { "type": "string" }
, "minItems": 1
, "maxCombinedLength": 50
}
Функция пользовательского ключевого слова получит 50
как параметр schema
, массив как параметр data
и полную схему как параметр parent_schema
.
Параметр parent_schema
используется для запроса типа массива. Если мы не ожидаем строк, мы можем обнулить ключевое слово maxCombinedLength
, вернув true
.
person
customcommander
schedule
24.03.2020