В Joi массивы описываются через Joi.array() и позволяют
задавать строгие ограничения на количество элементов, типы данных внутри
массива и их структуру. Ограничения длины массива являются одной из
ключевых частей валидации, поскольку часто требуется контролировать
размер коллекций: списков идентификаторов, тегов, элементов формы или
параметров запроса.
Ограничение минимального количества элементов задаётся методом
min(n).
const Joi = require('joi');
const schema = Joi.object({
tags: Joi.array().min(2)
});
schema.validate({ tags: ['js'] });
// Ошибка: "tags" must contain at least 2 items
Поведение min(n):
n элементовmin(1)Типичный сценарий применения — обязательный набор данных, например минимум два контакта пользователя или несколько категорий товара.
Метод max(n) ограничивает верхнюю границу количества
элементов.
const schema = Joi.object({
roles: Joi.array().max(3)
});
schema.validate({ roles: ['admin', 'editor', 'user', 'guest'] });
// Ошибка: "roles" must contain less than or equal to 3 items
Особенности:
Метод length(n) задаёт строго фиксированное количество
элементов.
const schema = Joi.object({
coordinates: Joi.array().length(2)
});
schema.validate({ coordinates: [10] });
// Ошибка: "coordinates" must contain 2 items
Используется, когда структура строго фиксирована:
[x, y][r, g, b]Ограничения можно комбинировать для более точного контроля.
const schema = Joi.object({
values: Joi.array().min(2).max(5)
});
Логика проверки:
При этом length(n) конфликтует с min/max,
поскольку задаёт фиксированное значение.
Важно различать поведение required() и ограничений
длины.
const schema = Joi.object({
list: Joi.array().min(1).required()
});
Сценарии:
required[] → ошибка min(1)Если требуется разрешить пустой массив:
Joi.array().allow([])
или
Joi.array().min(0)
Ограничения длины часто используются вместе с проверкой типов
элементов через items().
const schema = Joi.object({
ids: Joi.array().items(Joi.number().integer()).min(1).max(10)
});
Здесь одновременно проверяется:
Метод unique() не влияет на длину напрямую, но может
косвенно изменять результат валидации.
const schema = Joi.object({
tags: Joi.array().unique().min(2)
});
Поведение:
При использовании ordered() структура массива
фиксируется по позициям, но длина всё равно регулируется отдельно.
const schema = Joi.array().ordered(
Joi.string(),
Joi.number()
).length(2);
Это означает:
JavaScript позволяет создавать разреженные массивы, и Joi учитывает это поведение.
const arr = [1, , 3];
Валидация:
undefinedmin/max/length применяются к размеру
массива, а не к заполненностиJoi позволяет переопределять сообщения для ограничений длины.
const schema = Joi.array()
.min(2)
.messages({
'array.min': 'Необходимо минимум 2 элемента'
});
Распространённые ключи ошибок:
array.minarray.maxarray.lengthЭто позволяет адаптировать ответы под пользовательский интерфейс или API-стандарты.
Ограничение длины массива применяется в типичных задачах:
При проектировании схем важно учитывать пограничные ситуации:
undefined и отсутствие поля[]null элементамиПример строгой схемы:
const schema = Joi.object({
batch: Joi.array()
.items(Joi.string().required())
.min(1)
.max(100)
.required()
});
Такая конфигурация гарантирует:
Joi не изменяет длину массива автоматически, но может участвовать в
преобразовании значений через кастомные правила и
preprocess.
const schema = Joi.object({
list: Joi.array().min(1).custom((value) => {
return value.filter(Boolean);
})
});
В этом случае: