Введение
joi позволяет описывать ваши данные с помощью простого, интуитивного и удобочитаемого языка.
Пример
const Joi = require('joi');
const schema = Joi.object({
username: Joi.string()
.alphanum()
.min(3)
.max(30)
.required(),
password: Joi.string()
.pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
repeat_password: Joi.ref('password'),
access_token: [
Joi.string(),
Joi.number()
],
birth_year: Joi.number()
.integer()
.min(1900)
.max(2013),
email: Joi.string()
.email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })
})
.with('username', 'birth_year')
.xor('password', 'access_token')
.with('password', 'repeat_password');
schema.validate({ username: 'abc', birth_year: 1994 });
// -> { value: { username: 'abc', birth_year: 1994 } }
schema.validate({});
// -> { value: {}, error: '"username" is required' }
// Also -
try {
const value = await schema.validateAsync({ username: 'abc', birth_year: 1994 });
}
catch (err) { }Вышеприведённая схема определяет следующие ограничения:
-
username- обязательная строка
- должна содержать только буквенно-цифровые символы
- длина от 3 до 30 символов
- должна сопровождаться
birth_year
-
password- необязательная строка
- должна соответствовать пользовательскому шаблону регулярного выражения
- не может использоваться вместе с
access_token - должна сопровождаться
repeat_passwordи быть равной ей
-
access_token- необязательная, не ограниченная строка или число
-
birth_year- целое число от 1900 до 2013
-
email- строка, соответствующая адресу электронной почты
- должна содержать две части домена, например
example.com - TLD должен быть
.comили.net
Общее использование
Использование состоит из двух шагов:
Во-первых, схема создаётся с использованием предоставленных типов и ограничений:
const schema = Joi.object({
a: Joi.string()
});Обратите внимание, что объекты схем joi являются неизменяемыми, что означает, что каждое добавление правила (например, .min(5)) вернёт новый объект схемы.
Во-вторых, значение проверяется по заданной схеме:
const { error, value } = schema.validate({ a: 'a string' });Если входное значение является допустимым, то error будет undefined. Если входное значение недопустимо, error присваивается объект ValidationError, предоставляющий дополнительную информацию.
Схема может быть обычным объектом JavaScript, где каждый ключ назначен типу joi, или это может быть тип joi напрямую:
const schema = Joi.string().min(10);Если схема — это тип joi, то schema.validate(value) может быть вызван непосредственно на типе. При передаче объекта схемы, не являющегося типом, модуль преобразует его во внутренний объект типа object(), эквивалентный:
const schema = Joi.object().keys({
a: Joi.string()
});При проверке схемы:
-
Значения (или ключи в случае объектов) по умолчанию являются необязательными.
Joi.string().validate(undefined); // validates fine
Чтобы запретить это поведение, вы можете либо установить схему как
required(), либо установитьpresenceв"required"при передачеoptions:Joi.string().required().validate(undefined); // or Joi.string().validate(undefined, /* options */ { presence: "required" });
-
Строки по умолчанию закодированы в utf-8.
-
Правила определяются добавлением и вычисляются в порядке, сначала включительные, а затем исключительные.
assert(value, schema, [message], [options])
Проверяет значение по схеме и выбрасывает исключение, если проверка завершилась неудачно, где:
-
value- значение для проверки. -
schema- схема проверки. Может быть объектом типа joi или обычным объектом, где каждый ключ назначается объекту типа joi с использованиемJoi.compile(будьте осторожны с затратами на многократную компиляцию одних и тех же схем). -
message- необязательный префикс сообщения, добавляемый перед сообщением об ошибке. Может быть также объектом Error. -
options- необязательный объект опций, передаваемый вany.validate
Joi.assert('x', Joi.number());
attempt(value, schema, [message], [options])
Проверяет значение по схеме, возвращает допустимый объект и выбрасывает исключение, если проверка завершилась неудачно, где:
-
value- значение для проверки. -
schema- схема проверки. Может быть объектом типа joi или обычным объектом, где каждый ключ назначается объекту типа joi с использованиемJoi.compile(будьте осторожны с затратами на многократную компиляцию одних и тех же схем). -
message- необязательный префикс сообщения, добавляемый перед сообщением об ошибке. Может быть также объектом Error. -
options- необязательный объект опций, передаваемый вany.validate
Joi.attempt('x', Joi.number()); // throws error
const result = Joi.attempt('4', Joi.number()); // result -> 4
cache.provision([options])
Создаёт простой кэш LRU для кэширования простых входных данных (undefined, null, строк, чисел и булевых значений), где:
-
options- необязательные настройки:-
max- количество элементов в кэше до удаления наименее используемых. По умолчанию1000.
-
checkPreferences(prefs)
Проверяет, являются ли предоставленные настройки допустимыми, где:
-
prefs- объект настроек для проверки.
Выбрасывает исключение, если объект prefs недействителен.
Этот метод предназначен для проверки входных данных для методов any.validate() и any.validateAsync(). Проверка не выполняется автоматически по соображениям производительности. Вместо этого вручную проверьте предоставленные настройки один раз и используйте повторно.
compile(schema, [options])
Преобразует литеральное определение схемы в объект схемы joi (или возвращает тот же объект, если это уже объект схемы joi), где:
-
schema- определение схемы для компиляции. -
options- необязательные настройки:-
legacy- еслиtrueи предоставленная схема использует более старую версию joi, вернёт откомпилированную схему, совместимую со старой версией. Еслиfalse, схема всегда компилируется с использованием текущей версии, а если найдены компоненты более старой схемы, выбрасывается ошибка.
-
const definition = ['key', 5, { a: true, b: [/^a/, 'boom'] }];
const schema = Joi.compile(definition);
// Same as:
const schema = Joi.alternatives().try(
Joi.string().valid('key'),
Joi.number().valid(5),
Joi.object({
a: Joi.boolean().valid(true),
b: Joi.alternatives().try(
Joi.string().pattern(/^a/),
Joi.string().valid('boom')
)
})
);
defaults(modifier)
Создаёт новый экземпляр joi, применяющий предоставленную функцию модификатора к каждой новой схеме, где:
-
modifier- функция с сигнатуройfunction(schema), которая должна возвращать объект схемы.
const custom = Joi.defaults((schema) => {
switch (schema.type) {
case 'string':
return schema.allow('');
case 'object':
return schema.min(1);
default:
return schema;
}
});
const schema = custom.object(); // Returns Joi.object().min(1)
expression(template, [options]) - псевдонимы: x
Генерирует динамическое выражение, используя шаблонную строку, где:
-
template- шаблонная строка, использующая синтаксис шаблона. -
options- необязательные настройки, используемые при создании внутренних ссылок. Поддерживает те же опции, что иref().
Синтаксис шаблона
Шаблонный синтаксис использует {} и {{}} заключённые формулы для ссылки на значения и выполнения числовых и строковых операций. Одинарные фигурные скобки {} оставляют результат формулы как есть, в то время как двойные фигурные скобки {{}} HTML-экранируют результат формулы (если шаблон не используется для сообщений об ошибках и флаг настройки errors.escapeHtml установлен в false).
Если формула представляет собой единственную ссылку, которая начинается с : (например, {:#ref} или {{:#ref}}), её значения будут обернуты в соответствии с настройкой проверки wrap. Переменная #label всегда обернётся в соответствии с настройкой wrap.
Формула использует простой математический синтаксис, такой как a + b * 2, где именованные переменные формулы являются ссылками. Большинство ссылок можно использовать как есть, но некоторые могут создать неоднозначность в синтаксисе формулы и должны быть заключены в [] скобки (например, [.]).
Формулы могут работать только с null, булевыми значениями, числами и строками. Если какая-либо операция включает строку, все другие числа будут преобразованы в строки (поскольку внутренняя реализация использует простые операторы JavaScript). Поддерживаемые операторы: ^, *, /, %, +, -, <, <=, >, >=, ==, !=, &&, ||, и ?? (в этом порядке приоритета).
Имена ссылок могут иметь один из следующих префиксов:
-
#- указывает, что переменная ссылается на значение локального контекста. Например, в ошибках это контекст ошибки, а в операциях переименования — группы совпадения регулярного выражения. -
$- указывает, что переменная ссылается на значение глобального контекста из объекта настроекcontext, предоставленного в качестве опции функции проверки или установленного с помощьюany.prefs(). - любые другие переменные ссылаются на ключ в текущем проверяемом значении.
Синтаксис формулы также поддерживает встроенные функции:
-
if(condition, then, otherwise)- возвращаетthen, еслиconditionистинно, в противном случаеotherwise. -
length(item)- возвращает длину массива или строки, количество ключей объекта, в противном случаеnull. -
msg(code)- встраивает другое сообщение об ошибке. -
number(value)- преобразует значение в число.
И следующие константы:
nulltruefalse
extend(...extensions)
Создаёт новый настроенный экземпляр модуля joi, где:
-
extensions- конфигурации расширений, как описано в Расширения.
Обратите внимание, что исходный модуль joi не изменяется этим.
in(ref, [options])
Создаёт ссылку, которая при разрешении используется как массив значений для сопоставления с правилом, где:
Может использоваться только в правилах, которые поддерживают ссылки in-references.
const schema = Joi.object({
a: Joi.array().items(Joi.number()),
b: Joi.number().valid(Joi.in('a'))
});
isError(err)
Проверяет, является ли предоставленный аргумент ошибкой проверки.
Joi.isError(new Error()); // returns false
isExpression(expression)
Проверяет, является ли предоставленный аргумент выражением.
const expression = Joi.x('{a}');
Joi.isExpression(expression); // returns true
isRef(ref)
Проверяет, является ли предоставленный аргумент ссылкой. Полезно, если вы хотите дополнительно обработать сообщения об ошибках.
const ref = Joi.ref('a');
Joi.isRef(ref); // returns true
isSchema(schema, [options])
Проверяет, является ли переданный аргумент схемой joi, где:
-
schema- проверяемое значение. -
options- необязательные настройки:-
legacy- еслиtrue, будет определять схемы из более ранних версий joi, в противном случае выведет ошибку. По умолчаниюfalse.
-
const schema = Joi.any();
Joi.isSchema(schema); // returns true
override
Специальное значение, используемое с any.allow(), any.invalid(), и any.valid(), как первое значение для сброса ранее установленных значений.
Joi.valid(1).valid(Joi.override, 2);
// Same as:
Joi.valid(2);
// Whereas:
Joi.valid(1).valid(2);
// Is the same as:
Joi.valid(1, 2);
ref(key, [options])
Генерирует ссылку на значение указанного ключа. Ссылки разрешаются во время проверки и в порядке зависимости, так что если проверка одного ключа зависит от другого, зависимый ключ проверяется после проверки ссылки.
Ссылки поддерживают следующие аргументы:
-
key- целевой объект ссылки. Ссылки могут указывать на соседние ключи (a.b) или родительские ключи (...a.b) с использованием разделителя.. Если ссылка начинается с$, это означает ссылку на контекст, которая ищется в объекте опцийcontext. Ссылка может начинаться с одного или нескольких разделителей, чтобы указать относительную точку начала. -
options- необязательные настройки:-
adjust- функция со сигнатуройfunction(value), гдеvalue- разрешенное значение ссылки, а возвращаемое значение - скорректированное значение для использования. Например,(value) => value + 5добавит 5 к разрешенному значению. Обратите внимание, что функцияadjustне будет выполнять проверку типа на скорректированном значении, и оно должно соответствовать значению, ожидаемому правилом, в котором используется. Не может быть использовано сmap. -
map- массив пар массивов с форматом[[key, value], [key, value]], используемый для сопоставления разрешенного значения ссылки с другим значением. Если разрешенного значения нет в сопоставлении, оно возвращается как есть. Не может быть использовано сadjust. -
prefix- переопределяет символы префикса по умолчанию для строки ключа. Может быть установлено наfalse, чтобы отключить весь синтаксический разбор префиксов (обрабатывать ключи как буквальные строки), или объект со специфическими переопределениями для:-
global- ссылки на глобально предоставленные предпочтенияcontext. По умолчанию'$'. -
local- ссылки на контекст, специфичный для ошибки или правила. По умолчанию'#'. -
root- ссылки на корневое значение, проверяемое в данный момент. По умолчанию'/'.
-
-
separator- переопределяет разделитель иерархии.по умолчанию. Установите наfalse, чтобы рассматриватьkeyкак буквальное значение. -
ancestor- если установлено числом, устанавливает относительную точку начала ссылки. Нельзя сочетать с символами префикса разделителя. По умолчанию - префикс ключа ссылки (или1, если он отсутствует). -
in- создает внутреннюю ссылку. -
iterables- когдаtrue, ссылка разрешается путём доступа к картам и множествам. -
render- когдаtrue, значение ссылки используется вместо его имени в сообщениях об ошибках и рендеринге шаблонов. По умолчаниюfalse.
-
Обратите внимание, что ссылки могут использоваться только там, где это явно разрешено, например, в правилах valid() или invalid(). Если нужны ссылки на родительские элементы, используйте object.assert().
const schema = Joi.object({
a: Joi.ref('b.c'),
b: {
c: Joi.any()
},
c: Joi.ref('$x')
});
await schema.validateAsync({ a: 5, b: { c: 5 } }, { context: { x: 5 } });Ссылки относительно
По умолчанию ссылка относительна к родителю текущего значения (ключ ссылки ищется внутри родителя). Это означает, что в схеме:
{
x: {
a: Joi.any(),
b: {
c: Joi.any(),
d: Joi.ref('c')
}
},
y: Joi.any()
}Ссылка Joi.ref('c') указывает на c, что является соседним элементом с d - точкой начала ссылки является родитель d, который равен b. Эта схема означает, что d должно быть равно c.
Для ссылки на родительский элемент можно использовать префикс разделителя (используя . в качестве разделителя):
-
.- текущее значение -
..- родитель (то же, что и без префикса) -
...- прародитель -
....- прапрародитель - и т.д.
Например:
{
x: {
a: Joi.any(),
b: {
c: Joi.any(),
d: Joi.ref('c'),
e: Joi.ref('...a'),
f: Joi.ref('....y')
}
},
y: Joi.any()
}Другой способ указать относительную точку начала - использовать опцию ancestor, где:
- 0 - текущее значение
- 1 - родитель (это значение по умолчанию, если нет префикса ключа)
- 2 - прародитель
- 3 - прапрародитель
- и т.д.
Например:
{
x: {
a: Joi.any(),
b: {
c: Joi.any(),
d: Joi.ref('c', { ancestor: 1 }),
e: Joi.ref('a', { ancestor: 2 }),
f: Joi.ref('y', { ancestor: 3 })
}
},
y: Joi.any()
}Обратите внимание, что если ссылка пытается выйти за пределы корня значения, проверка завершается с ошибкой.
Чтобы указать абсолютный путь от корня значения, используйте префикс /:
{
x: {
a: Joi.any(),
b: {
c: Joi.ref('/x.a')
}
}
}
version
Свойство, отображающее текущую версию joi, используемую в данный момент.
types()
Возвращает объект, где каждый ключ — это обычный тип схемы joi. Полезно для создания сокращений типов с помощью деструктуризации. Обратите внимание, что типы уже сформированы и не нуждаются в вызове как функции (например, string, а не string()).
const Joi = require('joi');
const { object, string } = Joi.types();
const schema = object.keys({
property: string.min(4)
});
any
Генерирует объект схемы, соответствующий любому типу данных.
const any = Joi.any();
await any.validateAsync('a');
any.type
Получает тип схемы.
const schema = Joi.string();
schema.type === 'string'; // === true
any.allow(...values)
Разрешает значения, где:
-
values- один или несколько разрешённых значений, которые могут быть любого типа и будут сопоставлены с проверяемым значением перед применением других правил. Поддерживает ссылки и внутренние ссылки. Если первое значение —Joi.override, оно переопределит любые ранее установленные значения.
Обратите внимание, что этот список разрешённых значений дополняет любые другие разрешённые значения. Чтобы создать эксклюзивный список значений, см. any.valid(value).
const schema = {
a: Joi.any().allow('a'),
b: Joi.any().allow('b', 'B')
};
any.alter(targets)
Назначает опции изменения целевых значений схеме, которые применяются при вызове any.tailor(), где:
-
targets- объект, где каждый ключ — имя целевого значения, а каждое значение — функция со сигнатуройfunction(schema), которая возвращает схему.
const schema = Joi.object({
key: Joi.string()
.alter({
get: (schema) => schema.required(),
post: (schema) => schema.forbidden()
})
});
const getSchema = schema.tailor('get');
const postSchema = schema.tailor('post');
any.artifact(id)
Назначает схеме идентификатор артефакта, который включается в результат проверки, если правило прошло проверку, где:
-
id- любое значение, отличное отundefined, которое будет возвращено как есть в результатеartifactsкарты.
const schema = {
a: [
Joi.number().max(10).artifact('under'),
Joi.number().min(11).artifact('over')
]
};
any.cache([cache])
Добавляет кэширование в схему, которая будет пытаться кэшировать результаты проверки (успеха и ошибок) входящих данных, где:
-
cache- необязательная реализация кэша, совместимая с встроенным кэшем, предоставляемымcache.provision(). Еслиcacheне передан, кэш по умолчанию создаётся с помощьюcache.provision()внутри.
Обратите внимание, что решение о том, какие данные кэшировать, остается за реализацией кэша. Встроенный кэш будет хранить только простые значения, такие как undefined, null, строки, числа и булевы значения. Любые изменения в схеме после вызова any.cache() отключит кэширование в результирующей схеме. Это означает, что если .cache() не является последним оператором в определении схемы, кэширование будет отключено.
Чтобы отключить кэширование для всей схемы во время выполнения, установите предпочтение cache на false.
Кэширование игнорирует изменения в предпочтениях во время выполнения. Это означает, что если вы запустите schema.validate() один раз с одним набором предпочтений, а затем снова с другим (например, изменив язык), кешированные результаты будут основаны на первом наборе предпочтений.
Перед использованием кэширования рекомендуется рассмотреть выгоду в производительности, так как это не ускорит каждую схему. Схемы, использующие .valid() список, не получат выгоды от кэширования.
Кэширование будет проигнорировано, если схема использует ссылки за пределами области значения.
Интерфейс кэша
Реализация пользовательского кэша должна реализовать следующий интерфейс:
class {
set(key, value) {}
get(key) { return found ? value : undefined; }
}Обратите внимание, что key и value могут быть чем угодно, включая объекты, массивы и т. д. Рекомендуется ограничить размер кэша при проверке внешних данных, чтобы предотвратить возможность увеличения использования памяти процесса злоумышленником путём отправки большого количества разных данных для проверки.
any.cast(to)
Преобразует проверяемое значение в указанный тип, где:
-
to- целевой тип значения. Каждый тип схемы joi поддерживает свой набор целевых преобразований:-
'map'- поддерживается типомJoi.object(), преобразует результат в объектMap, содержащий пары ключ-значение объекта. -
'number'- поддерживаетсяJoi.boolean()иJoi.date(), преобразует результат в число. Для дат — количество миллисекунд с эпохи, а для булевых значений —0дляfalseи1дляtrue. -
'set'- поддерживается типомJoi.array(), преобразует результат в объектSet, содержащий значения массива. -
'string'- поддерживаетсяJoi.binary(),Joi.boolean(),Joi.date(), иJoi.number(), преобразует результат в строку.
-
any.concat(schema)
Возвращает новый тип, являющийся результатом добавления правил одного типа к другому, где:
-
schema- тип joi, который необходимо объединить в текущую схему. Может быть только того же типа, что и тип контекста, илиany. Если применяется к типуany, схема может быть любой другой схемой.
const a = Joi.string().valid('a');
const b = Joi.string().valid('b');
const ab = a.concat(b);
any.custom(method, [description])
Добавляет пользовательскую функцию проверки для выполнения произвольного кода, где:
-
method- настраиваемая (только синхронная) функция валидации с сигнатуройfunction(value, helpers), где:-
value- значение, подлежащее валидации. -
helpers- объект со следующими вспомогательными функциями:-
schema- текущая схема. -
state- текущее состояние валидации. -
prefs- текущие настройки. -
original- исходное значение, переданное на валидацию до любых преобразований. -
error(code, [local])- метод для генерации кодов ошибок с кодом сообщения и необязательным локальным контекстом. -
message(messages, [local])- метод для генерации ошибки с внутренним кодом'custom'ошибки и предоставленным объектом сообщений для использования в качестве переопределения. Обратите внимание, что это значительно медленнее, чем использование настройкиmessages, но гораздо проще в написании, когда производительность не важна. -
warn(code, [local])- метод для добавления предупреждения с кодом сообщения и необязательным локальным контекстом.
-
-
Примечание: если метод не возвращает значение, значение будет сброшено или возвращено как undefined.
const method = (value, helpers) => {
// Throw an error (will be replaced with 'any.custom' error)
if (value === '1') {
throw new Error('nope');
}
// Replace value with a new value
if (value === '2') {
return '3';
}
// Use error to return an existing error code
if (value === '4') {
return helpers.error('any.invalid');
}
// Override value with undefined to unset
if (value === '5') {
return undefined;
}
// Return the value unchanged
return value;
};
const schema = Joi.string().custom(method, 'custom validation');Возможные ошибки валидации: any.custom
any.default([value])
Устанавливает значение по умолчанию, если исходное значение undefined, где:
-
value- значение по умолчанию. Может быть:- литеральным значением (строка, число, объект и т. д.).
- ссылкой ссылки.
- функцией, возвращающей значение по умолчанию с сигнатурой
function(parent, helpers), где:-
parent- копия объекта, содержащего значение, подлежащее валидации. Обратите внимание, что поскольку указание аргументаparentвыполняет клонирование, не объявляйте аргументы формата, если не используете их. -
helpers- те же, что описаны вany.custom().
-
При вызове без каких-либо value для типа схемы объекта, значение по умолчанию будет автоматически сгенерировано на основе значений по умолчанию ключей объекта.
Обратите внимание, что если value является объектом, любые изменения в объекте после вызова default() изменят ссылку и любое последующее присваивание. Используйте функцию при установке динамического значения (например, текущего времени).
const generateUsername = (parent, helpers) => {
return parent.firstname.toLowerCase() + '-' + parent.lastname.toLowerCase();
};
generateUsername.description = 'generated username';
const schema = Joi.object({
username: Joi.string().default(generateUsername),
firstname: Joi.string(),
lastname: Joi.string(),
created: Joi.date().default(Date.now),
status: Joi.string().default('registered')
});
const { value } = schema.validate({
firstname: 'Jane',
lastname: 'Doe'
});
// value.status === 'registered'
// value.username === 'jane-doe'
// value.created will be the time of validationВозможные ошибки валидации: any.default
any.describe()
Возвращает объект, представляющий внутреннюю конфигурацию схемы. Полезно для отладки и экспонирования конфигурации схемы другим системам, например, допустимых значений в пользовательском интерфейсе.
const schema = Joi.any().valid('foo', 'bar');
console.log(schema.describe());Результатом является:
{ type: 'any',
flags: { only: true },
valids: [ 'foo', 'bar' ] }
any.description(desc)
Добавляет описание к ключу, где:
-
desc- строка описания.
const schema = Joi.any().description('this key will match anything you give it');
any.empty(schema)
Считает любое значение, соответствующее схеме, пустым (undefined).
-
schema- любой объект или схема joi для соответствия. Неопределённая схема сбрасывает это правило.
let schema = Joi.string().empty('');
schema.validate(''); // returns { error: null, value: undefined }
schema = schema.empty();
schema.validate(''); // returns { error: "value" is not allowed to be empty, value: '' }
any.error(err)
Переопределяет стандартную ошибку joi на пользовательскую ошибку, если правило не выполнено, где:
-
errможет быть:- экземпляром
Error- ошибки переопределения. - функцией с сигнатурой
function(errors), гдеerrors- массив отчетов о валидации, и она возвращает либо одиночнуюErrorили массив отчетов о валидации.
- экземпляром
Не используйте этот метод, если вы просто пытаетесь переопределить сообщение об ошибке — используйте any.message() или any.messages() вместо него. Этот метод предназначен для переопределения ошибки валидации joi и возвращения предоставленного переопределения. Он полезен, когда вы хотите вернуть результат валидации напрямую (например, при использовании с сервером hapi) и хотите вернуть другой код HTTP-ошибки, отличный от 400.
Обратите внимание, что если вы предоставите Error, оно будет возвращено как есть, без изменений и без украшения какими-либо обычными свойствами ошибок. Если валидация завершится неудачей и будет найдена другая ошибка перед переопределением ошибки, будет возвращена эта ошибка, а переопределение будет проигнорировано (если не была установлена настройка abortEarly с значением false). Если вы установите несколько ошибок для одной схемы, используется только последняя ошибка.
const schema = Joi.string().error(new Error('Was REALLY expecting a string'));
schema.validate(3); // returns Error('Was REALLY expecting a string')const schema = Joi.object({
foo: Joi.number().min(0).error((errors) => new Error('"foo" requires a positive number'))
});
schema.validate({ foo: -2 }); // returns new Error('"foo" requires a positive number')const schema = Joi.object({
foo: Joi.number().min(0).error((errors) => {
return new Error('found errors with ' + errors.map((err) => `${err.local.key}(${err.local.limit}) with value ${err.local.value}`).join(' and '));
})
});
schema.validate({ foo: -2 }); // returns new Error('found errors with foo(0) with value -2')
any.example(example, [options])
Добавляет примеры к схеме, где:
-
example- добавляет пример. Обратите внимание, что валидация значения не выполняется. -
options- необязательные настройки:-
override- еслиtrue, заменяет любые существующие примеры. По умолчаниюfalse.
-
const schema = Joi.string().min(4).example('abcd');
any.external(method, [description])
Добавляет внешнее правило валидации, где:
-
method- асинхронная или синхронная функция с сигнатуройfunction(value, helpers), которая может либо вернуть заменяющее значение,undefinedчтобы указать отсутствие изменений, или вызвать ошибку, где:-
value- копия объекта, содержащего значение, подлежащее валидации. -
helpers- объект со следующими вспомогательными функциями:-
schema- текущая схема. -
linked- если схема является ссылкой, схема, к которой она ссылается. -
state- текущее состояние валидации. -
prefs- текущие настройки. -
original- исходное значение, переданное на валидацию до любых преобразований. -
error(code, [local])- метод для генерации кодов ошибок с кодом сообщения и необязательным локальным контекстом. -
message(messages, [local])- метод для генерации ошибки с внутренним кодом'external'ошибки и предоставленным объектом сообщений для использования в качестве переопределения. Обратите внимание, что это значительно медленнее, чем использование настройкиmessages, но гораздо проще в написании, когда производительность не важна. -
warn(code, [local])- метод для добавления предупреждения с кодом сообщения и необязательным локальным контекстом.
-
-
-
description- необязательная строка, используемая для документирования цели метода.
Обратите внимание, что правила внешней валидации вызываются только после проверки всех других правил валидации для всей схемы (от корневого значения). Это означает, что любые изменения, внесённые правилами внешней валидации, недоступны для других правил валидации во время фазы валидации, не связанной с внешними правилами.
Если валидация схемы завершилась неудачей, правила внешней валидации не вызываются.
any.extract(path)
Возвращает подсхему на основе пути из ключей объекта или идентификаторов схем, где:
-
path- строка пути с разделителем точка.или предварительно разделенный массив ключей пути. Ключи должны соответствовать идентификатору подсхемы или ключу объекта (если явно не был установлен идентификатор).
const schema = Joi.object({ foo: Joi.object({ bar: Joi.number() }) });
const number = schema.extract('foo.bar');
//or
const result = schema.extract(['foo', 'bar']); //same as number
any.failover(value)
Устанавливает значение резервного копирования, если исходное значение не проходит валидацию, где:
-
value- значение резервного копирования.valueподдерживает ссылки.valueможет быть присвоена функция, возвращающая значение по умолчанию. Еслиvalueуказана как функция, принимающая один параметр, этот параметр будет объектом контекста, который можно использовать для получения результирующего значения.
Обратите внимание, что если value является объектом, любые изменения в объекте после вызова failover() изменят ссылку и любое последующее присваивание. Используйте функцию при установке динамического значения (например, текущего времени).
Использование функции с одним аргументом выполняет некоторое внутреннее клонирование, что влияет на производительность. Если вам не нужен доступ к контексту, определите функцию без аргументов.
Возможные ошибки валидации: any.failover
any.forbidden()
Помечает ключ как запрещённый, что не позволит использовать значение, кроме undefined. Используется для явного запрета ключей.
const schema = {
a: Joi.any().forbidden()
};Возможные ошибки валидации: any.unknown
any.fork(paths, adjuster)
Возвращает новую схему, где каждый из указанных ключей пути был изменён, где:
-
paths- массив строк ключей, одиночная строка ключа или массив массивов предварительно разделенных строк ключей. Строки путей ключей используют точку.для обозначения иерархии ключей. -
adjuster- функция с сигнатуройfunction(schema), которая должна вернуть изменённую схему. Например,(schema) => schema.required().
Метод не изменяет исходную схему.
any.id(id)
Устанавливает идентификатор схемы для доступа к схеме с помощью any.extract(), где:
-
id- буквенно-цифровая строка (плюс_) для идентификации схемы.
Если идентификатор не задан, идентификатор схемы по умолчанию соответствует ключу объекта, с которым она связана. Если схема используется в массиве или типе альтернатив и идентификатор не задан, схема недоступна.
any.invalid(...values) - псевдонимы: disallow, not
Запрещает значения, где:
-
values- запрещённые значения, которые могут быть любого типа и будут сопоставлены со значением, подлежащим валидации, прежде чем будут применены другие правила. Поддерживает ссылки и внутренние ссылки. Если первое значение являетсяJoi.override, переопределяет любые ранее установленные значения.
const schema = {
a: Joi.any().invalid('a'),
b: Joi.any().invalid('b', 'B')
};Возможные ошибки валидации: any.invalid
any.keep()
То же, что и rule({ keep: true }).
Обратите внимание, что keep() завершит текущий набор правил и не может быть последует другой опцией правила. Используйте rule() для применения нескольких опций правил.
any.label(name)
Переопределяет имя ключа в сообщениях об ошибках.
-
name- имя ключа.
const schema = {
first_name: Joi.string().label('First Name')
};
any.message(message)
То же, что и rule({ message }).
Обратите внимание, что message() завершит текущий набор правил и не может быть последует другой опцией правила. Используйте rule() для применения нескольких опций правил.
any.messages(messages)
То же, что и any.prefs({ messages }).
Обратите внимание, что в то время как any.message() применяется только к последнему правилу или набору правил, any.messages() применяется ко всему схеме.
any.meta(meta)
Присоединяет метаданные к ключу, где:
-
meta- объект метаданных для присоединения.
const schema = Joi.any().meta({ index: true });
any.note(...notes)
Аннотирует ключ, где:
-
notes- строка заметки или несколько заметок в качестве отдельных аргументов.
const schema = Joi.any().note('this is special', 'this is important');
any.only()
Требует, чтобы проверенное значение соответствовало предоставленным any.allow() значениям. Не оказывает влияния, когда вызывается вместе с any.valid(), так как уже устанавливает требования. При использовании с any.allow() преобразует его в any.valid().
any.optional()
Помечает ключ как необязательный, что позволит undefined в качестве значений. Используется для аннотации схемы для читабельности, так как все ключи по умолчанию необязательны.
Примечание: это не позволяет null значения. Для этого используйте any.allow(value). Или оба!
const schema = Joi.any().optional();
any.prefs(options) - псевдонимы: preferences, options
Переопределяет глобальные validate() опции для текущего ключа и всех вложенных ключей, где:
-
options- объект с теми же необязательными ключами, что иany.validate().
const schema = Joi.any().prefs({ convert: false });
any.presence(mode)
Устанавливает режим присутствия для схемы, где:
-
mode- может быть одним из'optional','required', или'forbidden'
То же, что и вызов any.optional(), any.required(), или any.forbidden().
any.raw([enabled])
Выводит исходное неизменённое значение вместо приведённого значения, где:
-
enabled- еслиtrue, возвращается исходный результат, в противном случае — проверенное значение. По умолчаниюtrue.
Обратите внимание, что сырое значение применяется только после проверки, и любые ссылки на значение используют проверенное значение, а не сырое.
const timestampSchema = Joi.date().timestamp();
timestampSchema.validate('12376834097810'); // { error: null, value: Sat Mar 17 2362 04:28:17 GMT-0500 (CDT) }
const rawTimestampSchema = Joi.date().timestamp().raw();
rawTimestampSchema.validate('12376834097810'); // { error: null, value: '12376834097810' }
any.required() - псевдонимы: exist
Помечает ключ как обязательный, что не позволит undefined в качестве значения. Все ключи по умолчанию необязательны.
const schema = Joi.any().required();Возможные ошибки проверки: any.required
any.result(mode)
Устанавливает режим результата, где:
-
mode- один из'raw'(то же, что иany.raw()) или'strip'(то же, что иany.strip()).
any.rule(options)
Применяет набор опций правил к текущему набору правил или последнему добавленному правилу, где:
-
options- правила для применения, где:-
keep- еслиtrue, правила не будут заменены тем же уникальным правилом позже. Например,Joi.number().min(1).rule({ keep: true }).min(2)сохранит обаmin()правила вместо того, чтобы позднее правило заменило первое. По умолчаниюfalse. -
message- одна строка сообщения или объект сообщений, где каждый ключ — код ошибки, а соответствующая строка сообщения — значение. Объект аналогиченmessagesиспользуемому в качестве опции вany.validate(). Строки могут быть простыми сообщениями или шаблоном сообщения. -
warn- еслиtrue, преобразует любую ошибку, сгенерированную набором правил, в предупреждения.
-
При применении опций правил используется последнее правило (например, min()) за исключением случаев, когда определён активный набор правил (например, $.min().max()) в этом случае опции применяются ко всем предоставленным правилам. После вызова rule(), предыдущие правила больше нельзя изменить, и любой активный набор правил завершается.
Изменения правил могут быть применены только к поддерживаемым правилам. Большинство any методов не поддерживают изменения правил, потому что они реализованы с использованием флагов схемы (например, required()) или специальной внутренней реализации (например, valid()). В этих случаях используйте метод any.messages(), чтобы переопределить коды ошибок для ошибок, которые вы хотите настроить.
any.ruleset - псевдонимы: $
Инициализирует набор правил для применения нескольких опций правил. Набор завершается, когда вызывается rule(), keep(), message() или warn().
const schema = Joi.number().ruleset.min(1).max(10).rule({ message: 'Number must be between 1 and 10' });const schema = Joi.number().$.min(1).max(10).rule({ message: 'Number must be between 1 and 10' });
any.shared(schema)
Регистрирует схему, которая будет использоваться потомками текущей схемы в ссылках на именованные ссылки, где:
-
schema- схема joi со свойством id.
const schema = Joi.object({
a: [Joi.string(), Joi.link('#x')],
b: Joi.link('#type.a')
})
.shared(Joi.number().id('x'))
.id('type');
any.strict(isStrict)
Режим строгости устанавливает options.convert опции в false, что предотвращает приведение типов для текущего ключа и всех вложенных ключей.
-
isStrict- включен ли режим строгости или нет. По умолчанию true.
const schema = Joi.any().strict();
any.strip([enabled])
Помечает ключ для удаления из результирующего объекта или массива после проверки для очистки вывода, где:
-
enabled- еслиtrue, значение удаляется, в противном случае проверенное значение сохраняется. По умолчаниюtrue.
const schema = Joi.object({
username: Joi.string(),
password: Joi.string().strip()
});
schema.validate({ username: 'test', password: 'hunter2' }); // result.value = { username: 'test' }
const schema = Joi.array().items(Joi.string(), Joi.any().strip());
schema.validate(['one', 'two', true, false, 1, 2]); // result.value = ['one', 'two']
any.tag(...tags)
Аннотирует ключ, где:
-
tags- строка тега или несколько тегов (каждый как аргумент).
const schema = Joi.any().tag('api', 'user');
any.tailor(targets)
Применяет все назначенные изменения целевых значений к копии схемы, которые были применены через any.alter(), где:
-
targets- одна строка целевого значения или массив или строки целевых значений для применения.
const schema = Joi.object({
key: Joi.string()
.alter({
get: (schema) => schema.required(),
post: (schema) => schema.forbidden()
})
});
const getSchema = schema.tailor('get');
const postSchema = schema.tailor(['post']);
any.unit(name)
Аннотирует ключ, где:
-
name- имя единицы измерения значения.
const schema = Joi.number().unit('milliseconds');
any.valid(...values) - псевдонимы: equal
Добавляет предоставленные значения в список разрешенных значений и помечает их как единственно допустимые значения, где:
-
values- одно или несколько разрешенных значений, которые могут быть любого типа и будут сопоставлены с проверяемым значением перед применением других правил. Поддерживает ссылки и внутренние ссылки. Если первое значение —Joi.override, оно переопределит все ранее заданные значения. Если единственное значение —Joi.override, также удалит флагonlyиз схемы.
const schema = {
a: Joi.any().valid('a'),
b: Joi.any().valid('b', 'B')
};Возможные ошибки проверки: any.only
any.validate(value, [options])
Проверяет значение с помощью текущей схемы и опций, где:
-
value- значение, подлежащее валидации. -
options- необъект с необязательными ключами:-
abortEarly- приtrue, останавливает валидацию на первой ошибке, в противном случае возвращает все найденные ошибки. По умолчаниюtrue. -
allowUnknown- приtrue, разрешает объекту содержать неизвестные ключи, которые игнорируются. По умолчаниюfalse. -
cache- приtrue, кеширование схем включено (для схем с явными правилами кеширования). По умолчаниюtrue. -
context- предоставляет внешний набор данных для использования в ссылках. Может быть установлен только как внешний параметр дляvalidate()и не используется сany.prefs(). -
convert- приtrue, пытается привести значения к требуемым типам (например, строку к числу). По умолчаниюtrue. -
dateFormat- устанавливает формат строки, используемый при преобразовании дат в строки в сообщениях об ошибках и при приведении типов. Варианты:-
'date'- строка даты. -
'iso'- строка даты и времени в формате ISO. Это значение по умолчанию. -
'string'- строка даты и времени по умолчанию для JavaScript. -
'time'- строка времени. -
'utc'- строка даты и времени в формате UTC.
-
-
debug- приtrue, результаты валидации и ошибки снабжаются свойствомdebug, которое включает массив шагов валидации, использованных для получения возвращаемого результата. По умолчаниюfalse. -
errors- настройки форматирования сообщений об ошибках:-
escapeHtml- приtrue, шаблоны сообщений об ошибках будут экранировать специальные символы в HTML-сущности для обеспечения безопасности. По умолчаниюfalse. -
label- определяет значение, используемое для установки контекстного переменнойlabel:-
'path'- полный путь к проверяемому значению. Это значение по умолчанию. -
'key'- ключ проверяемого значения. -
false- удаляет любой префикс метки из сообщения об ошибке, включая"".
-
-
language- предпочтительный код языка для сообщений об ошибках. Значение сопоставляется с ключами в корне объектаmessages, а затем с кодом ошибки как дочерним ключом. Может ссылаться на значение, глобальный контекст или локальный контекст, который является корневым значением, переданным функции валидации. Обратите внимание, что ссылки на значение обычно не являются тем, что вам нужно, так как они перемещаются по структуре значения относительно места возникновения ошибки. Вместо этого используйте глобальный контекст или абсолютное значение (например,Joi.ref('/variable')); -
render- приfalse, пропускает отрисовку шаблонов ошибок. Полезно, когда сообщения об ошибках генерируются в другом месте для экономии времени обработки. По умолчаниюtrue. -
stack- приtrue, основное сообщение об ошибке будет содержать стек вызовов, в противном случае он будет отключен. По умолчаниюfalseпо соображениям производительности. Не оказывает влияния на платформы, отличные от V8/node.js, так как использует API стека вызовов. -
wrap- переопределяет способ обертывания значений (например,[]вокруг массивов,""вокруг меток и переменных с префиксом:). Каждый ключ может быть установлен на строку с одним (одинаковым символом перед и после значения) или двумя символами (первый символ перед и второй символ после) илиfalseдля отключения обертывания:-
label- символы, используемые вокруг{#label}ссылок. По умолчанию'"'. -
array- символы, используемые вокруг значений массива. По умолчанию'[]'. -
string- символы, используемые вокруг каждого значения строки в массиве. По умолчаниюfalse.
-
-
wrapArrays- еслиtrue, значения массивов в сообщениях об ошибках оборачиваются в[]. По умолчаниюtrue.
-
-
externals- еслиfalse, внешние правила, установленные с помощьюany.external(), игнорируются, что необходимо для игнорирования внешних проверок в синхронном режиме (или выбрасывается исключение). По умолчаниюtrue. -
messages- переопределяет отдельные сообщения об ошибках. По умолчанию переопределение отключено ({}). Используйте'*'код ошибки в качестве универсального для всех кодов ошибок, для которых не предоставлено сообщение в переопределении. Сообщения используют те же правила, что и шаблоны. Переменные в двойных фигурных скобках{{var}}экранируются в HTML, если опцияerrors.escapeHtmlустановлена вtrue. -
noDefaults- приtrue, значения по умолчанию не применяются. По умолчаниюfalse. -
nonEnumerables- приtrue, входные данные клонируются с поверхностным копированием, чтобы включить неперечисляемые свойства. По умолчаниюfalse. -
presence- устанавливает требования наличия по умолчанию. Поддерживаемые режимы:'optional','required', и'forbidden'. По умолчанию'optional'. -
skipFunctions- приtrue, игнорируются неизвестные ключи со значением типа функция. По умолчаниюfalse. -
stripUnknown- удаляет неизвестные элементы из объектов и массивов. По умолчаниюfalse.- при
object:-
arrays- устанавливается вtrueдля удаления неизвестных элементов из массивов. -
objects- устанавливается вtrueдля удаления неизвестных ключей из объектов.
-
- при
true, это эквивалентно{ arrays: false, objects: true }.
- при
-
Возвращает объект со следующими ключами:
-
value- валидированное и нормализованное значение. -
error- сообщения об ошибках валидации, если они есть. -
warning- сгенерированные предупреждения, если таковые имеются. -
artifacts- объектMap, содержащий артефакты успешных правил и соответствующие массивы путей.
const schema = Joi.object({
a: Joi.number()
});
const value = {
a: '123'
};
const result = schema.validate(value);
// result -> { value: { "a" : 123 } }
any.validateAsync(value, [options])
Асинхронно проверяет значение с использованием текущей схемы и параметров, где:
-
value- значение, подлежащее валидации. -
options- необязательный объект, как описано вany.validate(), со следующими дополнительными параметрами:-
artifacts- приtrue, артефакты возвращаются вместе со значением (то есть{ value, artifacts }). По умолчаниюfalse. -
warnings- приtrue, предупреждения возвращаются вместе со значением (то есть{ value, warning }). По умолчаниюfalse.
-
Возвращает Promise, который разрешается в валидированное значение, когда значение корректно. Если значение корректно и параметры warnings или debug установлены в true, возвращает объект { value, warning, debug }. Если проверка завершается неудачей, обещание отклоняется с ошибкой валидации.
const schema = Joi.object({
a: Joi.number()
});
const value = {
a: '123'
};
try {
const value = await schema.validateAsync(value);
// value -> { "a" : 123 }
}
catch (err) {
}
any.warn()
Аналогично rule({ warn: true }).
Обратите внимание, что warn() завершит текущий набор правил и за ним не может следовать другой параметр правила. Используйте rule() для применения нескольких параметров правил.
any.warning(code, [context])
Генерирует предупреждение, где:
-
code- код предупреждения. Может быть существующим кодом ошибки или настраиваемым кодом. Если используется настраиваемый код, соответствующее определение сообщения об ошибке должно быть настроено черезany.message(),any.prefs()или параметр валидацииmessages. -
context- необязательный контекстный объект.
При вызове any.validateAsync(), установите параметр warning в true для включения предупреждений. Предупреждения сообщаются отдельно от ошибок вместе со значением результата через ключ warning (то есть { value, warning }). Предупреждения всегда включаются при вызове any.validate().
const schema = Joi.any()
.warning('custom.x', { w: 'world' })
.message({ 'custom.x': 'hello {#w}!' });
const { value, error, warning } = schema.validate('anything');
// value -> 'anything';
// error -> null
// warning -> { message: 'hello world!', details: [...] }
// or
try {
const { value, warning } = await schema.validateAsync('anything', { warnings: true });
// value -> 'anything';
// warning -> { message: 'hello world!', details: [...] }
}
catch (err) { }
any.when([condition], options)
Добавляет условия, которые оцениваются во время валидации и изменяют схему перед ее применением к значению, где:
-
condition- имя ключа, ссылка или схема. Если опущено, по умолчаниюJoi.ref('.'). -
options- объект с:-
is- условие, выраженное как схема joi. Все, что не является схемой joi, будет преобразовано с помощью Joi.compile. По умолчанию схема условияisдопускает значенияundefined. Используйте.required()для переопределения. Например, используйтеis: Joi.number().required()для гарантии, что ссылка joi существует и является числом. -
not- обратная версияis(thenиotherwiseимеют обратные роли). -
then- если условие истинно, используемая схема joi. -
otherwise- если условие ложно, используемая схема joi. -
switch- массив из{ is, then }условий, которые оцениваются относительноcondition. Последний элемент массива также может содержатьotherwise. -
break- останавливает обработку всех других условий, если правило приводит кthen,otherwise, илиswitchсоответствию.
-
Если condition является ссылкой:
- если
is,not, иswitchотсутствуют,isпо умолчаниюJoi.invalid(null, false, 0, '').required()(значение должно быть истинным). -
isиnotне могут использоваться вместе. - требуется одно из
then,otherwise, илиswitch. - нельзя использовать
isилиthenсswitch. - нельзя указать
otherwiseкак внутри последнегоswitchутверждения, так и вне его.
Если condition является схемой:
- нельзя указать
isилиswitch. - требуется одно из
thenилиotherwise.
Когда is, then, или otherwise присваиваются литеральные значения, значения компилируются в переопределяющие схемы ('x' компилируется в Joi.valid(Joi.override, 'x')). Это означает, что они будут переопределять любую базовую схему, к которой применяется правило. Чтобы добавить литеральное значение, используйте явный формат Joi.valid('x').
Примечания:
- неверная комбинация изменений схемы (например, попытка добавить правила строк или тип числа) приведет к тому, что валидация выбросит ошибку.
- поскольку схема создается во время валидации, это может значительно повлиять на производительность. Сгенерированные во время выполнения схемы кэшируются, но первый раз каждая генерация займет больше времени, чем после кэширования.
const schema = {
a: Joi.any()
.valid('x')
.when('b', { is: Joi.exist(), then: Joi.valid('y'), otherwise: Joi.valid('z') })
.when('c', { is: Joi.number().min(10), then: Joi.forbidden() }),
b: Joi.any(),
c: Joi.number()
};Или со схемой:
const schema = Joi.object({
a: Joi.any().valid('x'),
b: Joi.any()
})
.when(Joi.object({ b: Joi.exist() }).unknown(), {
then: Joi.object({
a: Joi.valid('y')
}),
otherwise: Joi.object({
a: Joi.valid('z')
})
});Обратите внимание, что этот стиль гораздо полезнее, когда вся ваша схема зависит от значения одного из её свойств, или если вы обнаруживаете, что повторяете проверку для многих ключей объекта. Например, для проверки этой логики:
const schema = Joi.object({
type: Joi.string()
.valid('A', 'B', 'C')
.required(), // required if type == 'A'
foo: Joi.when('type', {
is: 'A',
then: Joi.string()
.valid('X', 'Y', 'Z')
.required()
}), // required if type === 'A' and foo !== 'Z'
bar: Joi.string()
})
.when(Joi.object({ type: Joi.valid('A'), foo: Joi.not('Z') }).unknown(), {
then: Joi.object({ bar: Joi.required() })
});В качестве альтернативы, если вы хотите указать определённый тип, такой как string, array, и т.д., вы можете сделать это так:
const schema = {
a: Joi.valid('a', 'b', 'other'),
other: Joi.string()
.when('a', { is: 'other', then: Joi.required() }),
};Если вам нужно проверить дочерний ключ внутри вложенного объекта на основе значения его брата, вы можете сделать это так:
const schema = Joi.object({
a: Joi.boolean().required(),
b: Joi.object()
.keys({
c: Joi.string(),
d: Joi.number().required()
})
.required()
.when('a', {
is: true,
then: Joi.object({ c: Joi.required() }) // b.c is required only when a is true
})
});Если вы хотите проверить один ключ на основе существования другого ключа, вы можете сделать это следующим образом (обратите внимание на использование required()):
const schema = Joi.object({
min: Joi.number(),
max: Joi.number().when('min', {
is: Joi.number().required(),
then: Joi.number().greater(Joi.ref('min')),
}),
});Для оценки нескольких значений по одному ссылочному объекту:
const schema = Joi.object({
a: Joi.number().required(),
b: Joi.number()
.when('a', {
switch: [
{ is: 0, then: Joi.valid(1) },
{ is: 1, then: Joi.valid(2) },
{ is: 2, then: Joi.valid(3) }
],
otherwise: Joi.valid(4)
})
});Или короче:
const schema = Joi.object({
a: Joi.number().required(),
b: Joi.number()
.when('a', [
{ is: 0, then: 1 },
{ is: 1, then: 2 },
{ is: 2, then: 3, otherwise: 4 }
])
});
alternatives
Генерирует тип, который будет соответствовать одной из предоставленных альтернативных схем с помощью метода try(). Если схемы не добавлены, тип не будет соответствовать ни одному значению, кроме undefined.
Поддерживает те же методы типа any().
Альтернативы могут быть выражены с помощью сокращённой записи [].
const alt = Joi.alternatives().try(Joi.number(), Joi.string());
// Same as [Joi.number(), Joi.string()]Обратите внимание, что числовые строки будут приводиться к числам в примере выше (см. any.strict()).
Возможные ошибки валидации: alternatives.any, alternatives.all, alternatives.one, alternatives.types, alternatives.match
alternatives.conditional(condition, options)
Добавляет условный тип альтернативной схемы, либо на основе значения другого ключа, либо схемы, заглядывающей в текущее значение, где:
-
condition- имя ключа или ссылка, или схема. -
options- объект с:-
is- условие, выраженное как схема joi. Всё, что не является схемой joi, будет преобразовано с помощью Joi.compile. -
not- отрицательная версияis(thenиotherwiseимеют обратные роли). -
then- если условие истинно, используемая схема joi. -
otherwise- если условие ложно, используемая схема joi. -
switch- массив из{ is, then }условий, которые вычисляются относительноcondition. Последний элемент массива также может содержатьotherwise.
-
Если condition является ссылкой:
- если
is,not, иswitchотсутствуют,isпо умолчаниюJoi.invalid(null, false, 0, '').required()(значение должно быть истинным). -
isиnotне могут использоваться вместе. - требуется один из
then,otherwise, илиswitch. - нельзя использовать
isилиthenсswitch. - нельзя указать
otherwiseкак внутри последнего утвержденияswitch, так и снаружи.
Если condition является схемой:
- нельзя указать
isилиswitch. - требуется один из
thenилиotherwise.
Когда is, then, или otherwise назначены буквальным значениям, значения компилируются в схемы-переопределения ('x' компилируется в Joi.valid(Joi.override, 'x')). Это означает, что они переопределят любую базовую схему, к которой применяется правило. Для добавления литерального значения используйте явный формат Joi.valid('x').
Обратите внимание, что alternatives.conditional() отличается от any.when(). При использовании any.when() вы получаете составную схему всех соответствующих условий, тогда как alternatives.conditional() будет использовать первую соответствующую схему, игнорируя другие условные операторы.
const schema = {
a: Joi.alternatives().conditional('b', { is: 5, then: Joi.string(), otherwise: Joi.number() }),
b: Joi.any()
};const schema = Joi.alternatives().conditional(Joi.object({ b: 5 }).unknown(), {
then: Joi.object({
a: Joi.string(),
b: Joi.any()
}),
otherwise: Joi.object({
a: Joi.number(),
b: Joi.any()
})
});Обратите внимание, что conditional() добавляет только дополнительные альтернативы для проверки и не влияет на общий тип. Установка правила required() на отдельную альтернативу не будет применяться к общему ключу. Например, это определение a:
const schema = {
a: Joi.alternatives().conditional('b', { is: true, then: Joi.required() }),
b: Joi.boolean()
};Не делает a обязательным ключом, когда b равно true. Вместо этого он сообщает валидатору попытаться сопоставить значение с любым, что не является undefined. Однако, так как Joi.alternatives() само по себе допускает undefined, правило не выполняет превращение a в обязательное значение. Это правило эквивалентно Joi.alternatives([Joi.required()]) когда b равно true, что позволит любое значение, включая undefined.
Для достижения желаемого результата используйте:
const schema = {
a: Joi.when('b', { is: true, then: Joi.required() }),
b: Joi.boolean()
};
alternatives.match(mode)
Требует, чтобы проверяемое значение соответствовало определённому набору предоставленных alternative.try() схем, где:
-
mode- режим соответствия, который может быть одним из:-
'any'- сопоставить любую предоставленную схему. Это значение по умолчанию. -
'all'- сопоставить все предоставленные схемы. Обратите внимание, что это игнорирует любые преобразования, выполняемые сопоставляемыми схемами, и возвращает исходное значение независимо от предпочтенияconvert. -
'one'- сопоставить одну и только одну из предоставленных схем.
-
Примечание: Не может быть объединено с alternatives.conditional().
Возможные ошибки валидации: alternatives.any, alternatives.all, alternatives.one
alternatives.try(...schemas)
Добавляет альтернативный тип схемы для попытки сопоставления с проверяемым значением, где:
-
schemas- альтернативные типы joi, каждый как отдельный аргумент.
const alt = Joi.alternatives().try(Joi.number(), Joi.string());
await alt.validateAsync('a');
array
Генерирует объект схемы, который соответствует типу данных массива. Обратите внимание, что значения undefined внутри массивов по умолчанию запрещены, но могут быть разрешены с использованием sparse().
Поддерживает те же методы типа any().
const array = Joi.array().items(Joi.string().valid('a', 'b'));
await array.validateAsync(['a', 'b', 'a']);Возможные ошибки валидации: array.base
array.has(schema)
Проверяет, что схема проходит валидацию по крайней мере одного из значений в массиве, где:
-
schema- правила валидации, необходимые для удовлетворения проверки. Еслиschemaвключает ссылки, они разрешаются относительно элемента массива, который тестируется, а не значения целевогоref.
const schema = Joi.array().items(
Joi.object({
a: Joi.string(),
b: Joi.number()
})
).has(Joi.object({ a: Joi.string().valid('a'), b: Joi.number() }))Возможные ошибки валидации: array.hasKnown, array.hasUnknown
array.items(...types)
Перечисляет типы, разрешённые для значений массива, где:
-
types- один или более объектов схемы joi для проверки каждого элемента массива.
Если заданный тип .required(), то должен быть соответствующий элемент в массиве. Если тип .forbidden(), то он не может появляться в массиве. Обязательные элементы могут быть добавлены несколько раз, чтобы указать, что должно быть найдено несколько элементов. Ошибки будут содержать количество элементов, которые не совпали. Любой несовпавший элемент, имеющий метку, будет упомянут явно.
const schema = Joi.array().items(Joi.string(), Joi.number()); // array may contain strings and numbers
const schema = Joi.array().items(Joi.string().required(), Joi.string().required()); // array must contain at least two strings
const schema = Joi.array().items(Joi.string().valid('not allowed').forbidden(), Joi.string()); // array may contain strings, but none of those strings can match 'not allowed'
const schema = Joi.array().items(Joi.string().label('My string').required(), Joi.number().required()); // If this fails it can result in `[ValidationError: "value" does not contain [My string] and 1 other required value(s)]`Возможные ошибки валидации: array.excludes, array.includesRequiredBoth, array.includesRequiredKnowns, array.includesRequiredUnknowns, array.includes
array.length(limit)
Устанавливает точное количество элементов в массиве, где:
-
limit- допустимое число элементов массива или ссылка.
const schema = Joi.array().length(5);const schema = Joi.object({
limit: Joi.number().integer().required(),
numbers: Joi.array().length(Joi.ref('limit')).required()
});Возможные ошибки валидации: array.length, array.ref
array.max(limit)
Устанавливает максимальное количество элементов в массиве, где:
-
limit- максимальное допустимое число элементов массива или ссылка.
const schema = Joi.array().max(10);const schema = Joi.object({
limit: Joi.number().integer().required(),
numbers: Joi.array().max(Joi.ref('limit')).required()
});Возможные ошибки валидации: array.max, array.ref
array.min(limit)
Устанавливает минимальное количество элементов в массиве, где:
-
limit- минимальное допустимое число элементов массива или ссылка.
const schema = Joi.array().min(2);const schema = Joi.object({
limit: Joi.number().integer().required(),
numbers: Joi.array().min(Joi.ref('limit')).required()
});Возможные ошибки валидации: array.min, array.ref
array.ordered(...type)
Перечисляет типы в порядке следования для значений массива, где:
-
types- один или более объектов схемы joi для проверки каждого элемента массива в порядке следования.
Если заданный тип .required(), то должен быть соответствующий элемент с той же позицией в массиве. Ошибки будут содержать количество элементов, которые не совпали. Любой несовпавший элемент, имеющий метку, будет упомянут явно.
const schema = Joi.array().ordered(Joi.string().required(), Joi.number().required()); // array must have first item as string and second item as number
const schema = Joi.array().ordered(Joi.string().required()).items(Joi.number().required()); // array must have first item as string and 1 or more subsequent items as number
const schema = Joi.array().ordered(Joi.string().required(), Joi.number()); // array must have first item as string and optionally second item as numberВозможные ошибки валидации: array.excludes, array.includes, array.orderedLength
array.single([enabled])
Позволяет проверять отдельные значения по правилам, как если бы они были предоставлены в виде массива.
enabled можно использовать со значением falsy, чтобы вернуться к стандартному поведению.
const schema = Joi.array().items(Joi.number()).single();
schema.validate([4]); // returns `{ error: null, value: [ 4 ] }`
schema.validate(4); // returns `{ error: null, value: [ 4 ] }`Возможные ошибки валидации: array.excludes, array.includes
array.sort([options])
Требует, чтобы массив соответствовал указанному порядку сортировки, где:
-
options- необязательные настройки:-
order- порядок сортировки. Допустимые значения:-
'ascending'- сортировать массив по возрастанию. Это значение по умолчанию. -
'descending'- сортировать массив по убыванию.
-
-
by- имя ключа или ссылка для сортировки объектов массива по этому ключу. По умолчанию используется всё значение.
-
Примечания:
- Если предпочтение
convertравноtrue, массив изменяется для соответствия требуемому порядку сортировки. - Значения
undefinedвсегда помещаются в конец массива независимо от порядка сортировки. - Можно сортировать только элементы или значения ключей элементов строкового и числового типов.
Возможные ошибки валидации: array.sort, array.sort.unsupported, array.sort.mismatching
array.sparse([enabled])
Позволяет этому массиву быть разреженным. enabled можно использовать со значением falsy, чтобы вернуться к стандартному поведению.
let schema = Joi.array().sparse(); // undefined values are now allowed
schema = schema.sparse(false); // undefined values are now deniedВозможные ошибки валидации: array.sparse
array.unique([comparator, [options]])
Требует, чтобы значения массива были уникальными, где:
-
comparator- необязательный пользовательскийcomparator, который может быть:- Функцией, принимающей 2 параметра для сравнения. Эта функция должна возвращать значение, указывающее, равны ли 2 параметра, и вы отвечаете за корректную работу этой функции, любые
Errorбудут распространяться вверх по стеку Joi. - Строкой в точечной нотации, представляющей путь к элементу для проверки уникальности. Любой отсутствующий путь будет считаться неопределённым и может существовать только один раз.
- Функцией, принимающей 2 параметра для сравнения. Эта функция должна возвращать значение, указывающее, равны ли 2 параметра, и вы отвечаете за корректную работу этой функции, любые
-
options- необязательные настройки:-
ignoreUndefined- еслиtrue, неопределённые значения для точечной нотации компаратора не приведут к ошибке валидации массива по уникальности. По умолчаниюfalse. -
separator- переопределяет разделитель иерархии по умолчанию.. Установите значениеfalse, чтобы обрабатыватьkeyкак литеральное значение.
-
Примечание: помните, что при использовании пользовательской функции компаратора, в качестве параметров могут передаваться разные типы данных, в зависимости от установленных правил для элементов.
Обратите внимание, что глубокое сравнение выполняется для элементов массива типа object, ожидается снижение производительности при этом типе операций.
const schema = Joi.array().unique();const schema = Joi.array().unique((a, b) => a.property === b.property);const schema = Joi.array().unique('customer.id');let schema = Joi.array().unique('identifier');
schema.validate([{}, {}]);
// ValidationError: "value" position 1 contains a duplicate value
schema = Joi.array().unique('identifier', { ignoreUndefined: true });
schema.validate([{}, {}]);
// error: nullВозможные ошибки валидации: array.unique
binary
Генерирует объект схемы, соответствующий типу данных Buffer. Если опция валидации convert включена (по умолчанию включена), строка будет преобразована в Buffer, если указано.
Поддерживает те же методы, что и тип any().
const schema = Joi.binary();Возможные ошибки валидации: binary.base
binary.encoding(encoding)
Устанавливает формат кодировки строки, если входная строка преобразуется в буфер, где:
-
encoding- схема кодирования.
const schema = Joi.binary().encoding('base64');
binary.length(limit)
Указывает точную длину буфера:
-
limit- разрешенный размер буфера или ссылка.
const schema = Joi.binary().length(5);Возможные ошибки валидации: binary.length, binary.ref
binary.max(limit)
Указывает максимальную длину буфера, где:
-
limit- максимальный размер буфера или ссылка.
const schema = Joi.binary().max(10);Возможные ошибки валидации: binary.max, binary.ref
binary.min(limit)
Указывает минимальную длину буфера, где:
-
limit- минимальный размер буфера или ссылка.
const schema = Joi.binary().min(2);Возможные ошибки валидации: binary.min, binary.ref
boolean
Генерирует объект схемы, который соответствует типу данных boolean. Также может быть вызван через bool(). Если опция валидации convert включена (по умолчанию включена), строка ("true" или "false") будет преобразована в boolean, если указано.
Поддерживает те же методы, что и тип any().
const boolean = Joi.boolean();
await boolean.validateAsync(true); // Valid
await boolean.validateAsync(1); // ThrowsВозможные ошибки валидации: boolean.base
boolean.falsy(...values)
Позволяет рассматривать дополнительные значения как допустимые булевы значения, преобразуя их в false во время валидации. Требует, чтобы опция валидации convert была true.
Сравнения строк по умолчанию регистронезависимые, см. boolean.sensitive() для изменения этого поведения.
const boolean = Joi.boolean().falsy('N');
await boolean.validateAsync('N'); // Valid
boolean.sensitive([enabled])
Ограничивает значения до truthy и falsy, а также 'true' и 'false' стандартных преобразований (если не в strict() режиме) для соответствия регистрозависимым образом, где:
-
enabled- приfalse, разрешает регистронезависимое сравнение. По умолчаниюtrue.
const schema = Joi.boolean().truthy('yes').falsy('no').sensitive();
boolean.truthy(...values)
Позволяет рассматривать дополнительные значения как допустимые булевы значения, преобразуя их в true во время валидации. Требует, чтобы опция валидации convert была true.
Сравнения строк по умолчанию регистронезависимые, см. boolean.sensitive() для изменения этого поведения.
const boolean = Joi.boolean().truthy('Y');
await boolean.validateAsync('Y'); // Valid
date
Генерирует объект схемы, соответствующий типу данных date (а также строке JavaScript date или количеству миллисекунд). Если опция валидации convert включена (по умолчанию включена), строка или число будут преобразованы в Date, если указано. Обратите внимание, что некоторые недопустимые строки дат будут приняты, если их можно привести к допустимым датам (например, '2/31/2019' будет преобразовано в '3/3/2019' ) с помощью внутренней реализации JS Date.parse().
Примечание: При использовании joi в среде браузера, от парсинга строк дат с конструктором Date (и Date.parse(), работающим аналогично) настоятельно рекомендуется отказаться из-за различий и несоответствий браузеров. Например, '1-1-1910' является допустимым в Chrome, но вызовет ошибку в Safari.
Поддерживает те же методы, что и тип any().
const date = Joi.date();
await date.validateAsync('12-21-2012');Возможные ошибки валидации: date.base, date.strict
date.greater(date)
Указывает, что значение должно быть больше date (или ссылки).
const schema = Joi.date().greater('1-1-1974');Примечания: 'now' может быть передано вместо date, чтобы всегда сравнивать относительно текущей даты, позволяя явно гарантировать, что дата находится в прошлом или в будущем. При использовании 'now', обратите внимание, что это включает текущее время, и два значения сравниваются на основе их метки времени UTC в миллисекундах.
const schema = Joi.date().greater('now');const schema = Joi.object({
from: Joi.date().required(),
to: Joi.date().greater(Joi.ref('from')).required()
});Возможные ошибки валидации: date.greater, date.ref
date.iso()
Требует, чтобы строковое значение имело допустимый формат даты ISO 8601.
const schema = Joi.date().iso();Возможные ошибки валидации: date.format
date.less(date)
Указывает, что значение должно быть меньше date (или ссылки).
const schema = Joi.date().less('12-31-2020');Примечания: 'now' может быть передано вместо date, чтобы всегда сравнивать относительно текущей даты, позволяя явно гарантировать, что дата находится в прошлом или в будущем.
const schema = Joi.date().less('now');const schema = Joi.object({
from: Joi.date().less(Joi.ref('to')).required(),
to: Joi.date().required()
});Возможные ошибки валидации: date.less, date.ref
date.max(date)
Указывает самую позднюю разрешенную дату, где:
-
date- самая поздняя разрешенная дата или ссылка.
const schema = Joi.date().max('12-31-2020');Примечания: 'now' может быть передано вместо date, чтобы всегда сравнивать относительно текущей даты, позволяя явно гарантировать, что дата находится в прошлом или в будущем.
const schema = Joi.date().max('now');const schema = Joi.object({
from: Joi.date().max(Joi.ref('to')).required(),
to: Joi.date().required()
});Возможные ошибки валидации: date.max, date.ref
date.min(date)
Указывает самую раннюю разрешенную дату, где:
-
date- самая ранняя разрешенная дата или ссылка.
const schema = Joi.date().min('1-1-1974');Примечания: 'now' может быть передано вместо date, чтобы всегда сравнивать относительно текущей даты, позволяя явно гарантировать, что дата находится в прошлом или в будущем.
const schema = Joi.date().min('now');const schema = Joi.object({
from: Joi.date().required(),
to: Joi.date().min(Joi.ref('from')).required()
});Возможные ошибки валидации: date.min, date.ref
date.timestamp([type])
Требуется, чтобы значение было интервалом временных меток с момента времени Unix.
-
type- тип временной метки (разрешенные значенияunixилиjavascript[по умолчанию])
const schema = Joi.date().timestamp(); // defaults to javascript timestamp
const schema = Joi.date().timestamp('javascript'); // also, for javascript timestamp (milliseconds)
const schema = Joi.date().timestamp('unix'); // for unix timestamp (seconds)Возможные ошибки валидации: date.format
function - наследуется от object
Генерирует объект схемы, соответствующий типу функции.
Поддерживает те же методы типа object(). Обратите внимание, что валидация ключей функции приведет к клонированию функции. Хотя функция сохранит свой прототип и замыкание, она потеряет значение свойства length (будет установлено в 0).
const func = Joi.function();
await func.validateAsync(function () {});Возможные ошибки валидации: object.base
function.arity(n)
Определяет арность функции, где:
-
n- ожидаемая арность.
const schema = Joi.function().arity(2);Возможные ошибки валидации: function.arity
function.class()
Требует, чтобы функция была классом.
const schema = Joi.function().class();Возможные ошибки валидации: function.class
function.maxArity(n)
Определяет максимальную арность функции, где:
-
n- ожидаемая максимальная арность.
const schema = Joi.function().maxArity(3);Возможные ошибки валидации: function.maxArity
function.minArity(n)
Определяет минимальную арность функции, где:
-
n- ожидаемая минимальная арность.
const schema = Joi.function().minArity(1);Возможные ошибки валидации: function.minArity
link(ref)
Ссылки на другой узел схемы и повторно использует его для проверки, обычно для творческих рекурсивных схем, где:
-
ref- ссылка на связанный узел схемы. Нельзя ссылаться на себя или своих потомков, а также на другие ссылки. Ссылки могут быть выражены в относительных терминах, таких как ссылки на значения (Joi.link('...')), в абсолютных терминах от корня схемы во время выполнения (Joi.link('/a')), или используя идентификаторы схем неявно с помощью ключей объекта или явно с помощьюany.id()(Joi.link('#a.b.c')).
Поддерживает методы типа any().
При сочетании с правилами any.when(), правила применяются после разрешения ссылки к связанной схеме.
Именованные ссылки рекомендуются для большинства случаев использования, так как они легко поддаются пониманию и анализу, а при ошибках выводится сообщение об ошибке с недействительной ссылкой. Относительные ссылки часто трудно отследить, особенно при вложенности в массивы или правилах альтернатив. Абсолютные ссылки полезны только тогда, когда схема никогда не повторно используется внутри другой схемы, так как корень — это корень схемы во время выполнения, а не текущий корень схемы.
Обратите внимание, что именованные ссылки должны быть найдены в непосредственном предке ссылки. Имена ищутся путем итерации по цепочке схем от текущей схемы до корня. Чтобы добраться до дяди или двоюродного брата, нужно использовать имя общего предка, например, дедушки, а затем спуститься по дереву.
Ссылки разрешаются один раз (на период выполнения) и результат схемы кэшируется. Если вы повторно используете ссылку в разных местах, в первый раз при разрешении во время выполнения результат будет использоваться всеми другими экземплярами. Если вы хотите, чтобы каждая ссылка разрешалась относительно места ее использования, используйте отдельный оператор Joi.link() в каждом месте или установите флаг relative().
Именованные ссылки:
const person = Joi.object({
firstName: Joi.string().required(),
lastName: Joi.string().required(),
children: Joi.array()
.items(Joi.link('#person'))
})
.id('person');Относительные ссылки:
const person = Joi.object({
firstName: Joi.string().required(),
lastName: Joi.string().required(),
children: Joi.array()
.items(Joi.link('...'))
// . - the link
// .. - the children array
// ... - the person object
});Абсолютные ссылки:
const person = Joi.object({
firstName: Joi.string().required(),
lastName: Joi.string().required(),
children: Joi.array()
.items(Joi.link('/'))
});
link.ref(ref)
Инициализирует схему после создания для случаев, когда схема должна быть создана сначала, а затем инициализирована. Если ref не был передан в конструктор, необходимо вызвать link.ref(), прежде чем использовать его.
Вызовет ошибку во время проверки, если не инициализирован (например, Joi.link() вызван без ссылки и link.ref() не вызван).
const schema = Joi.object({
a: [Joi.string(), Joi.number()],
b: Joi.link().ref('#type.a')
})
.id('type');
link.concat(schema)
То же, что и any.concat(), но схема объединяется после разрешения ссылки, что позволяет объединять схемы того же типа, что и разрешенная ссылка. Вызовет исключение во время проверки, если объединенные типы несовместимы.
number
Генерирует объект схемы, соответствующий числовому типу данных (а также строкам, которые можно преобразовать в числа).
По умолчанию допускаются только безопасные числа, см. number.unsafe().
Если опция проверки convert включена (по умолчанию), строка преобразуется в число, если указано. Также, если convert включена и используется number.precision(), значение будет преобразовано в указанный precision.
Infinity и -Infinity по умолчанию недопустимы, можно изменить это поведение, вызвав allow(Infinity, -Infinity).
Поддерживает те же методы типа any().
const number = Joi.number();
await number.validateAsync(5);Возможные ошибки валидации: number.base, number.infinity
number.greater(limit)
Указывает, что значение должно быть больше limit или ссылки.
const schema = Joi.number().greater(5);const schema = Joi.object({
min: Joi.number().required(),
max: Joi.number().greater(Joi.ref('min')).required()
});Возможные ошибки валидации: number.greater, number.ref
number.integer()
Требует, чтобы число было целым (без дробной части).
const schema = Joi.number().integer();Возможные ошибки валидации: number.base
number.less(limit)
Указывает, что значение должно быть меньше limit или ссылки.
const schema = Joi.number().less(10);const schema = Joi.object({
min: Joi.number().less(Joi.ref('max')).required(),
max: Joi.number().required()
});Возможные ошибки валидации: number.less, number.ref
number.max(limit)
Указывает максимальное значение, где:
-
limit- максимально допустимое значение или ссылка.
const schema = Joi.number().max(10);const schema = Joi.object({
min: Joi.number().max(Joi.ref('max')).required(),
max: Joi.number().required()
});Возможные ошибки валидации: number.max, number.ref
number.min(limit)
Указывает минимальное значение, где:
-
limit- минимально допустимое значение или ссылка.
const schema = Joi.number().min(2);const schema = Joi.object({
min: Joi.number().required(),
max: Joi.number().min(Joi.ref('min')).required()
});Возможные ошибки валидации: number.min, number.ref
number.multiple(base)
Указывает, что значение должно быть кратно base (или ссылке):
const schema = Joi.number().multiple(3);Примечания: Joi.number.multiple(base) использует оператор остатка (%) для определения, является ли число кратным другому числу. Поэтому существуют обычные ограничения оператора остатка Javascript. Результаты с десятичными/дробными числами могут быть некорректными.
Возможные ошибки валидации: number.multiple, number.ref
number.negative()
Требуется, чтобы число было отрицательным.
const schema = Joi.number().negative();Возможные ошибки валидации: number.negative
number.port()
Требуется, чтобы число было TCP-портом, то есть находилось в диапазоне от 0 до 65535.
const schema = Joi.number().port();Возможные ошибки валидации: number.port
number.positive()
Требуется, чтобы число было положительным.
const schema = Joi.number().positive();Возможные ошибки валидации: number.positive
number.precision(limit)
Указывает максимальное количество знаков после запятой, где:
-
limit- максимально допустимое количество знаков после запятой.
const schema = Joi.number().precision(2);Возможные ошибки валидации: number.integer
number.sign(sign)
Требуется, чтобы число было отрицательным или положительным, где: sign - одно из значений 'negative' или 'positive'.
Возможные ошибки валидации: number.negative, number.positive
number.unsafe([enabled])
По умолчанию числа должны быть в пределах безопасного диапазона JavaScript (Number.MIN_SAFE_INTEGER & Number.MAX_SAFE_INTEGER), и при передаче строки должны быть преобразованы без потери информации. Вы можете разрешить небезопасные числа на свой страх и риск, вызвав number.unsafe().
Параметры:
-
enabled- необязательный параметр, по умолчаниюtrue, который позволяет сбросить поведение небезопасности, передав ложное значение.
const safeNumber = Joi.number();
safeNumber.validate(90071992547409924);
// error -> "value" must be a safe number
const unsafeNumber = Joi.number().unsafe();
unsafeNumber.validate(90071992547409924);
// error -> null
// value -> 90071992547409920Возможные ошибки валидации: number.unsafe
object
Генерирует объект схемы, соответствующий типу данных объект. По умолчанию разрешаются любые дочерние ключи.
Поддерживает те же методы типа any().
const object = Joi.object({
a: Joi.number().min(1).max(10).integer(),
b: 'some string'
});
await object.validateAsync({ a: 5 });Обратите внимание, что когда тип схемы объекта передается в качестве входного значения в другой метод joi (например, элемент массива) или устанавливается как определение ключа, конструктор Joi.object() может быть опущен. Например:
const schema = Joi.array().items({ a: Joi.string() });Возможные ошибки валидации: object.base
object.and(...peers, [options])
Определяет взаимосвязь «все или ничего» между ключами, где если один из ключей-партнёров присутствует, все они также требуются.
-
peers- имена ключей строк, все из которых, если присутствуют, обязательны. -
options- необязательные настройки:-
separator- переопределяет разделитель иерархии по умолчанию.. Установите вfalse, чтобы рассматриватьkeyкак литеральное значение. -
isPresent- функция, переопределяющая проверку на пустое значение по умолчанию. По умолчанию:(resolved) => resolved !== undefined
-
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).and('a', 'b');Возможные ошибки валидации: object.and
object.append([schema])
Добавляет разрешенные ключи объекта, где:
-
schema- необязательный объект, где каждый ключ назначен объекту типа joi. Еслиschemaимеет значениеnull,undefinedили{}, изменения не будут применены. Использует object.keys([schema]) для добавления ключей.
// Validate key a
const base = Joi.object({
a: Joi.number()
});
// Validate keys a, b.
const extended = base.append({
b: Joi.string()
});
object.assert(subject, schema, [message])
Проверяет утверждение, где:
-
subject- имя ключа, ссылка или выражение шаблона для проверки. Обратите внимание, что ссылка разрешается относительно самого объекта как значения, что означает, что если вы хотите сослаться на ключ проверяемого объекта, вы должны префикс пути ссылки с.. -
schema- правила валидации, необходимые для удовлетворения утверждения. Еслиschemaсодержит ссылки, они разрешаются относительно значения объекта, а не значения целевого объектаsubject. -
message- необязательное удобочитаемое сообщение, используемое при невыполнении утверждения. По умолчанию "не удалось пройти тест утверждения".
const schema = Joi.object({
a: {
b: Joi.string(),
c: Joi.number()
},
d: {
e: Joi.any()
}
}).assert('.d.e', Joi.ref('a.c'), 'equal to a.c');Возможные ошибки валидации: object.assert
object.instance(constructor, [name])
Требует, чтобы объект был экземпляром заданного конструктора, где:
-
constructor- функция конструктора, экземпляром которой должен быть объект. -
name- альтернативное имя для использования в ошибках валидации. Это полезно, когда функция конструктора не имеет имени.
const schema = Joi.object().instance(RegExp);Возможные ошибки валидации: object.instance
object.keys([schema])
Устанавливает или расширяет разрешенные ключи объекта, где:
-
schema- необязательный объект, где каждый ключ назначен объекту типа joi. Еслиschemaимеет значение{}, разрешенные ключи отсутствуют. Еслиschemaимеет значениеnullилиundefined, любой ключ разрешен. Еслиschema- объект с ключами, ключи добавляются к любым ранее определенным ключам (но сужает выбор, если все ключи были разрешены ранее). По умолчанию 'undefined', что разрешает любой дочерний ключ.
const base = Joi.object().keys({
a: Joi.number(),
b: Joi.string()
});
// Validate keys a, b and c.
const extended = base.keys({
c: Joi.boolean()
});Возможные ошибки валидации: object.unknown
object.length(limit)
Определяет точное количество ключей в объекте, где или ссылка:
-
limit- количество разрешенных ключей объекта.
const schema = Joi.object().length(5);Возможные ошибки валидации: object.length, object.ref
object.max(limit)
Определяет максимальное количество ключей в объекте, где:
-
limit- максимальное количество разрешенных ключей объекта или ссылка.
const schema = Joi.object().max(10);Возможные ошибки валидации: object.max, object.ref
object.min(limit)
Определяет минимальное количество ключей в объекте, где:
-
limit- минимальное количество разрешенных ключей или ссылка.
const schema = Joi.object().min(2);Возможные ошибки валидации: object.min, object.ref
object.nand(...peers, [options])
Определяет взаимоотношения между ключами, где не все пары могут присутствовать одновременно, где:
-
peers- имена ключей, если один присутствует, другие не могут присутствовать все. -
options- необязательные настройки:-
separator- переопределяет разделитель иерархии по умолчанию.. Установите вfalse, чтобы рассматриватьkeyкак литеральное значение. -
isPresent- функция, переопределяющая проверку на пустое значение по умолчанию. По умолчанию:(resolved) => resolved !== undefined
-
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).nand('a', 'b');Возможные ошибки валидации: object.nand
object.or(...peers, [options])
Определяет взаимоотношения между ключами, где одна из пар необходима (и более одной разрешена), где:
-
peers- имена ключей, по крайней мере один из которых должен присутствовать. -
options- необязательные настройки:-
separator- переопределяет разделитель иерархии по умолчанию.. Установите вfalse, чтобы рассматриватьkeyкак литеральное значение. -
isPresent- функция, переопределяющая проверку на пустое значение по умолчанию. По умолчанию:(resolved) => resolved !== undefined
-
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).or('a', 'b');Возможные ошибки валидации: object.missing
object.oxor(...peers, [options])
Определяет исключительные взаимоотношения между набором ключей, где только один разрешен, но ни один не обязателен, где:
-
peers- имена исключительных ключей, которые не должны появляться вместе, но где ни один не является обязательным. -
options- необязательные настройки:-
separator- переопределяет разделитель иерархии по умолчанию.. Установите вfalse, чтобы рассматриватьkeyкак литеральное значение. -
isPresent- функция, переопределяющая проверку на пустое значение по умолчанию. По умолчанию:(resolved) => resolved !== undefined
-
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).oxor('a', 'b');Возможные ошибки валидации: object.oxor
object.pattern(pattern, schema, [options])
Определяет правила валидации для неизвестных ключей, соответствующих шаблону, где:
-
pattern- шаблон, который может быть либо регулярным выражением, либо схемой joi, которая будет проверена на соответствие именам неизвестных ключей. Обратите внимание, что если шаблон является регулярным выражением, чтобы оно соответствовало всему имени ключа, оно должно начинаться с^и заканчиваться$. -
schema- объект схемы, соответствующий ключам, должен пройти проверку. -
options- настройки параметров:-
fallthrough- еслиtrue, несколько соответствующих шаблонов проверяются на соответствие ключу, иначе, как только найден шаблон соответствия, другие шаблоны не сравниваются. По умолчаниюfalse. -
matches- схема массива joi, используемая для проверки массива соответствующих ключей. Например,Joi.object().pattern(/\d/, Joi.boolean(), { matches: Joi.array().length(2) })потребует два соответствующих ключа. Если схемаmatchesне является схемой типа массив, она будет преобразована вJoi.array().items(matches). Если схемаmatchesсодержит ссылки, они разрешаются относительно предков следующим образом:- self - массив соответствующих ключей (
Joi.ref('.length')) - parent - значение объекта, содержащего ключи (
Joi.ref('a'))
- self - массив соответствующих ключей (
-
const schema = Joi.object({
a: Joi.string()
}).pattern(/\w\d/, Joi.boolean());
// OR
const schema = Joi.object({
a: Joi.string()
}).pattern(Joi.string().min(2).max(5), Joi.boolean());Возможные ошибки валидации: object.pattern.match
object.ref()
Требует, чтобы объект был ссылкой joi.
const schema = Joi.object().ref();Возможные ошибки валидации: object.refType
object.regex()
Требует, чтобы объект был объектом RegExp.
const schema = Joi.object().regex();Возможные ошибки валидации: object.regex
object.rename(from, to, [options])
Переименовывает ключ в другое имя (удаляет переименованный ключ), где:
-
from- оригинальное имя ключа или регулярное выражение, соответствующее ключам. -
to- новое имя ключа.toможет быть установлен наtemplate, который отображается во время выполнения с использованием текущего значения, глобального контекста и локального контекста, еслиfromявляется регулярным выражением (например, выражение/^(\d+)$/будет соответствовать ключам, состоящим только из цифр, с группой захвата, доступной в шаблоне через{#1}). -
options- необязательный объект со следующими необязательными ключами:-
alias- еслиtrue, не удаляет старое имя ключа, сохраняя новые и старые ключи на месте. По умолчаниюfalse. -
multiple- еслиtrue, позволяет переименовывать несколько ключей в один и тот же пункт назначения, где последнее переименование побеждает. По умолчаниюfalse. -
override- еслиtrue, позволяет переименовать ключ над существующим ключом. По умолчаниюfalse. -
ignoreUndefined- еслиtrue, пропускает переименование ключа, если он неопределен. По умолчаниюfalse.
-
Ключи переименовываются до применения других правил валидации. Если to - шаблон, ссылающийся на собственные ключи объекта (например, '{.prefix}-{#1}'), значение этих ключей - исходное входное значение, а не значение, сгенерированное после валидации. Если ключ переименован, а его значение не проходит проверку, сообщение об ошибке будет использовать переименованный ключ, а не исходный ключ, что может сбить с толку пользователей (метки могут помочь в некоторых случаях).
const object = Joi.object({
a: Joi.number()
}).rename('b', 'a');
await object.validateAsync({ b: 5 });Использование регулярного выражения:
const regex = /^foobar$/i;
const schema = Joi.object({
fooBar: Joi.string()
}).rename(regex, 'fooBar');
await schema.validateAsync({ FooBar: 'a'});Использование регулярного выражения с шаблоном:
const schema = Joi.object()
.rename(/^(\d+)$/, Joi.expression('x{#1}x'))
.pattern(/^x\d+x$/, Joi.any());
const input = {
123: 'x',
1: 'y',
0: 'z',
x4x: 'test'
};
const value = await Joi.compile(schema).validateAsync(input);
// value === { x123x: 'x', x1x: 'y', x0x: 'z', x4x: 'test' }Возможные ошибки валидации: object.rename.multiple, object.rename.override
object.schema([type])
Требует, чтобы объект был экземпляром схемы joi, где:
-
type- необязательная схема joi для требования.
const schema = Joi.object().schema();Возможные ошибки валидации: object.schema
object.unknown([allow])
Переопределяет обработку неизвестных ключей только для текущего объекта (не применяется к дочерним элементам), где:
-
allow- еслиfalse, неизвестные ключи не допускаются, в противном случае неизвестные ключи игнорируются.
const schema = Joi.object({ a: Joi.any() }).unknown();Возможные ошибки валидации: object.unknown
object.with(key, peers, [options])
Требует наличия других ключей всякий раз, когда указанный ключ присутствует, где:
-
key- ключевой элемент ссылки. -
peers- имена требуемых дополнительных ключей, которые должны появляться вместе сkey.peersможет быть одиночным строковым значением или массивом строковых значений. -
options- дополнительные настройки:-
separator- переопределяет разделитель иерархии по умолчанию. Установите значение вfalse, чтобы обрабатыватьkeyкак литеральное значение. -
isPresent- функция, которая переопределяет проверку значения по умолчанию. Значение по умолчанию:(resolved) => resolved !== undefined
-
Обратите внимание, что в отличие от object.and(), with() создаёт зависимость только между key и каждым из peers, а не между самими peers.
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).with('a', 'b');Возможные ошибки валидации: object.with
object.without(key, peers, [options])
Запрещает присутствие других ключей всякий раз, когда указанный ключ присутствует, где:
-
key- ключевой элемент ссылки. -
peers- имена запрещённых дополнительных ключей, которые не должны появляться вместе сkey.peersможет быть одиночным строковым значением или массивом строковых значений. -
options- дополнительные настройки:-
separator- переопределяет разделитель иерархии по умолчанию. Установите значение вfalse, чтобы обрабатыватьkeyкак литеральное значение. -
isPresent- функция, которая переопределяет проверку значения по умолчанию. Значение по умолчанию:(resolved) => resolved !== undefined
-
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).without('a', ['b']);Возможные ошибки валидации: object.without
object.xor(...peers, [options])
Определяет взаимоисключающие отношения между набором ключей, где один из них обязателен, но не одновременно, где:
-
peers- имена взаимоисключающих ключей, которые не должны появляться вместе, но где один из них обязателен. -
options- дополнительные настройки:-
separator- переопределяет разделитель иерархии по умолчанию. Установите значение вfalse, чтобы обрабатыватьkeyкак литеральное значение. -
isPresent- функция, которая переопределяет проверку значения по умолчанию. Значение по умолчанию:(resolved) => resolved !== undefined
-
const schema = Joi.object({
a: Joi.any(),
b: Joi.any()
}).xor('a', 'b');Возможные ошибки валидации: object.xor, object.missing
string
Генерирует объект схемы, соответствующий строковому типу данных.
Обратите внимание, что пустая строка по умолчанию не допускается и должна быть включена с помощью allow(''). Не нужно задумываться, просто помните, что пустая строка по умолчанию не является допустимой строкой. Также не нужно просить изменить это или спорить, почему это не имеет смысла. Эта тема закрыта.
Для указания значения по умолчанию в случае пустой строки используйте:
Joi.string()
.empty('')
.default('default value');Если предпочтение convert равно true (значение по умолчанию), строка будет преобразована с использованием указанных модификаторов для string.lowercase(), string.uppercase(), string.trim(), и каждого указанного замещения с помощью string.replace().
Поддерживает те же методы типа any().
const schema = Joi.string().min(1).max(10);
await schema.validateAsync('12345');Возможные ошибки валидации: string.base, string.empty
string.alphanum()
Требует, чтобы строковое значение содержало только символы a-z, A-Z и 0-9.
const schema = Joi.string().alphanum();Возможные ошибки валидации: string.alphanum
string.base64([options])
Требует, чтобы строковое значение было допустимой строкой base64; не проверяет декодированное значение.
-
options- дополнительные настройки:-
paddingRequired- еслиtrue, строка должна быть корректно дополнена символами=. Значение по умолчаниюtrue. -
urlSafe- еслиtrue, используется URI-безопасный формат base64, который заменяет+на-и\на_. Значение по умолчаниюfalse.
-
Символы заполнения не требуются для декодирования, так как количество пропущенных байтов можно определить по количеству цифр. При этом старайтесь использовать заполнение, если это возможно.
const schema = Joi.string().base64();
schema.validate('VE9PTUFOWVNFQ1JFVFM'); // ValidationError: "value" must be a valid base64 string
schema.validate('VE9PTUFOWVNFQ1JFVFM='); // No Error
const paddingRequiredSchema = Joi.string().base64({ paddingRequired: true });
paddingRequiredSchema.validate('VE9PTUFOWVNFQ1JFVFM'); // ValidationError: "value" must be a valid base64 string
paddingRequiredSchema.validate('VE9PTUFOWVNFQ1JFVFM='); // No Error
const paddingOptionalSchema = Joi.string().base64({ paddingRequired: false });
paddingOptionalSchema.validate('VE9PTUFOWVNFQ1JFVFM'); // No Error
paddingOptionalSchema.validate('VE9PTUFOWVNFQ1JFVFM='); // No ErrorВозможные ошибки валидации: string.base64
string.case(direction)
Устанавливает требуемый регистр строки, где:
-
direction- может быть либо'upper', либо'lower'.
const schema = Joi.string().case('lower');Возможные ошибки валидации: string.lowercase string.uppercase
string.creditCard()
Требует, чтобы число было номером кредитной карты (с использованием алгоритма Луна).
const schema = Joi.string().creditCard();Возможные ошибки валидации: string.creditCard
string.dataUri([options])
Требует, чтобы строковое значение было допустимой строкой URI данных.
-
options- дополнительные настройки:-
paddingRequired- необязательный параметр по умолчаниюtrue, который потребует заполнения=еслиtrueили сделает заполнение необязательным, еслиfalse.
-
const schema = Joi.string().dataUri();
schema.validate('VE9PTUFOWVNFQ1JFVFM='); // ValidationError: "value" must be a valid dataUri string
schema.validate('data:image/png;base64,VE9PTUFOWVNFQ1JFVFM='); // No ErrorВозможные ошибки валидации: string.dataUri
string.domain([options])
Требует, чтобы строковое значение было допустимым доменным именем.
-
options- дополнительные настройки:-
allowFullyQualified- еслиtrue, домены, заканчивающиеся символом., разрешены. Значение по умолчаниюfalse. -
allowUnicode- еслиtrue, разрешены символы Юникода. Значение по умолчаниюtrue. -
allowUnderscore- еслиtrue, подчёркивания (_) разрешены в доменном имени. Значение по умолчаниюfalse. -
minDomainSegments- количество сегментов, требуемых для домена. Значение по умолчанию2. -
maxDomainSegments- максимальное количество разрешённых сегментов домена. Значение по умолчанию — без ограничения. -
tlds- параметры для валидации TLD (домена верхнего уровня). По умолчанию TLD должен быть допустимым именем, указанным в реестре IANA. Для отключения проверки установитеtldsвfalse. Для настройки проверки TLD установите одно из следующих значений:-
allow- одно из:-
trueдля использования списка зарегистрированных TLD от IANA. Это значение по умолчанию. -
falseдля разрешения любых TLD, не указанных в спискеdeny, если он присутствует. - строка или массив разрешенных TLD. Нельзя использовать вместе с
deny.
-
-
deny- одно из:- строка или массив запрещенных TLD. Нельзя использовать вместе со списком пользовательских TLD.
-
-
const schema = Joi.string().domain();Возможные ошибки валидации: string.domain
string.email([options])
Требует, чтобы строковое значение было допустимым адресом электронной почты.
-
options- дополнительные настройки:-
allowFullyQualified- еслиtrue, домены, заканчивающиеся символом., разрешены. Значение по умолчаниюfalse. -
allowUnicode- еслиtrue, разрешены символы Юникода. Значение по умолчаниюtrue. -
allowUnderscore- еслиtrue, подчёркивания (_) разрешены в доменном имени. Значение по умолчаниюfalse. -
ignoreLength- еслиtrue, игнорируются ошибки длины некорректного адреса электронной почты. Значение по умолчаниюfalse. -
minDomainSegments- количество сегментов, требуемых для домена. Значение по умолчанию исключает домены с одним сегментом, такие какexample@io, что является допустимым адресом электронной почты, но очень редким. Значение по умолчанию2. -
maxDomainSegments- максимальное количество разрешённых сегментов домена. Значение по умолчанию — без ограничения. -
multiple- еслиtrue, разрешает несколько адресов электронной почты в одной строке, разделенные символами,илиseparator. Значение по умолчаниюfalse. -
separator- когдаmultipleравноtrue, переопределяет разделитель по умолчанию,. Строка может содержать один символ или несколько символов разделителя. Значение по умолчанию','. -
tlds- параметры для проверки TLD (домена верхнего уровня). По умолчанию TLD должен быть допустимым именем, указанным в реестре IANA. Для отключения проверки установитеtldsвfalse. Для настройки проверки TLD установите одно из следующих значений:-
allow- одно из:-
trueдля использования списка зарегистрированных TLD от IANA. Это значение по умолчанию. -
falseдля разрешения любых TLD, не указанных в спискеdeny, если он присутствует. - строка или массив разрешенных TLD. Нельзя использовать вместе с
deny.
-
-
deny- одно из:- строка или массив запрещенных TLD. Нельзя использовать вместе со списком пользовательских TLD.
-
-
const schema = Joi.string().email();Обратите внимание, что цитированные адреса электронной почты (например, "test"@example.com) не поддерживаются и приведут к ошибке валидации.
Возможные ошибки валидации: string.email
string.guid() - псевдонимы: uuid
Требуется, чтобы строковое значение было допустимым GUID.
-
options- необязательные настройки:-
version- указывает одну или несколько допустимых версий. Может быть массивом или строкой со следующими значениями:uuidv1,uuidv2,uuidv3,uuidv4, илиuuidv5. Еслиversionне указано, предполагается общийguid, который не будет проверять версию или вариант guid, а только проверит общий формат структуры. -
separator- определяет разрешенный или обязательный разделитель GUID, где:-
true- разделитель обязателен, может быть либо:, либо-. -
false- разделитель запрещен. -
'-'- разделитель тире обязателен. -
':'- разделитель двоеточия обязателен. - По умолчанию необязательный
:или-разделитель.
-
-
const schema = Joi.string().guid({
version: [
'uuidv4',
'uuidv5'
]
});Возможные ошибки валидации: string.guid
string.hex([options])
Требуется, чтобы строковое значение было допустимой шестнадцатеричной строкой.
-
options- необязательные настройки:-
byteAligned- логическое значение, указывающее, нужно ли проверять, что шестнадцатеричная строка выровнена по байтам. Еслиconvertимеет значениеtrue, в начале строки будет добавлен0, если это необходимо для выравнивания. По умолчаниюfalse.
-
const schema = Joi.string().hex();Возможные ошибки валидации: string.hex, string.hexAlign
string.hostname()
Требуется, чтобы строковое значение было допустимым именем хоста в соответствии с RFC1123.
const schema = Joi.string().hostname();Возможные ошибки валидации: string.hostname
string.insensitive()
Разрешает соответствие значения любому значению в разрешенном или запрещенном списке в сравнении без учета регистра.
const schema = Joi.string().valid('a').insensitive();
string.ip([options])
Требуется, чтобы строковое значение было допустимым IP-адресом.
-
options- необязательные настройки:-
version- Одна или несколько версий IP-адресов для проверки. Допустимые значения:ipv4,ipv6,ipvfuture -
cidr- Используется для определения разрешения или запрета CIDR. Допустимые значения:optional,required,forbidden
-
// Accept only ipv4 and ipv6 addresses with a CIDR
const schema = Joi.string().ip({
version: [
'ipv4',
'ipv6'
],
cidr: 'required'
});Возможные ошибки валидации: string.ip, string.ipVersion
string.isoDate()
Требуется, чтобы строковое значение было в допустимом формате даты ISO 8601.
Если опция валидации convert включена (по умолчанию включена), строка будет принудительно преобразована в упрощенный расширенный формат ISO (ISO 8601). Имейте в виду, что эта операция использует объект javascript Date, который не поддерживает полный формат ISO, поэтому некоторые форматы могут не пройти при использовании convert.
const schema = Joi.string().isoDate();
schema.validate('2018-11-28T18:25:32+00:00'); // No Error
schema.validate('20181-11-28T18:25:32+00:00'); // ValidationError: must be a valid 8601 date
schema.validate(''); // ValidationError: must be a valid 8601 dateВозможные ошибки валидации: string.isoDate
string.isoDuration()
Требуется, чтобы строковое значение было в допустимом формате продолжительности ISO 8601.
const schema = Joi.string().isoDuration();
schema.validate('P3Y6M4DT12H30M5S'); // No Error
schema.validate('2018-11-28T18:25:32+00:00'); // ValidationError: must be a valid ISO 8601 duration
schema.validate(''); // ValidationError: must be a valid ISO 8601 durationВозможные ошибки валидации: string.isoDuration
string.length(limit, [encoding])
Устанавливает необходимую точную длину строки, где:
-
limit- необходимая длина строки или ссылка. -
encoding- если указано, длина строки рассчитывается в байтах с использованием указанной кодировки.
const schema = Joi.string().length(5);const schema = Joi.object({
length: Joi.string().required(),
value: Joi.string().length(Joi.ref('length'), 'utf8').required()
});Возможные ошибки валидации: string.length, string.ref
string.lowercase()
Требуется, чтобы строковое значение было в нижнем регистре. Если опция валидации convert включена (по умолчанию включена), строка будет принудительно преобразована в нижний регистр.
const schema = Joi.string().lowercase();Возможные ошибки валидации: string.lowercase
string.max(limit, [encoding])
Устанавливает максимальное количество символов строки, где:
-
limit- максимальное количество символов строки или ссылка. -
encoding- если указано, длина строки рассчитывается в байтах с использованием указанной кодировки.
const schema = Joi.string().max(10);const schema = Joi.object({
max: Joi.string().required(),
value: Joi.string().max(Joi.ref('max'), 'utf8').required()
});Возможные ошибки валидации: string.max, string.ref
string.min(limit, [encoding])
Устанавливает минимальное количество символов строки, где:
-
limit- минимальное количество символов строки или ссылка. -
encoding- если указано, длина строки рассчитывается в байтах с использованием указанной кодировки.
const schema = Joi.string().min(2);const schema = Joi.object({
min: Joi.string().required(),
value: Joi.string().min(Joi.ref('min'), 'utf8').required()
});Возможные ошибки валидации: string.min, string.ref
string.normalize([form])
Требуется, чтобы строковое значение было в нормализованной форме Unicode. Если опция валидации convert включена (по умолчанию включена), строка будет нормализована.
-
form- Форма нормализации Unicode. Допустимые значения:NFC[по умолчанию],NFD,NFKC,NFKD
const schema = Joi.string().normalize(); // defaults to NFC
const schema = Joi.string().normalize('NFC'); // canonical composition
const schema = Joi.string().normalize('NFD'); // canonical decomposition
const schema = Joi.string().normalize('NFKC'); // compatibility composition
const schema = Joi.string().normalize('NFKD'); // compatibility decompositionВозможные ошибки валидации: string.normalize
string.pattern(regex, [name | options]) - псевдонимы: regex
Определяет правило шаблона, где:
-
regex- объект регулярного выражения, которому должно соответствовать значение строкового значения. Обратите внимание, что если шаблон — это регулярное выражение, для соответствия всему имени ключа он должен начинаться с^и заканчиваться$. -
name- необязательное имя для шаблонов (полезно для нескольких шаблонов). -
options- необъект конфигурации со следующими поддерживаемыми свойствами:-
name- необязательное имя шаблона. -
invert- необязательный булев флаг. По умолчанию используется поведениеfalse. Если задано какtrue, предоставленный шаблон будет запрещен вместо обязательного.
-
const schema = Joi.string().pattern(/^[abc]+$/);
const inlineNamedSchema = Joi.string().pattern(/^[0-9]+$/, 'numbers');
inlineNamedSchema.validate('alpha'); // ValidationError: "value" with value "alpha" fails to match the numbers pattern
const namedSchema = Joi.string().pattern(/^[0-9]+$/, { name: 'numbers'});
namedSchema.validate('alpha'); // ValidationError: "value" with value "alpha" fails to match the numbers pattern
const invertedSchema = Joi.string().pattern(/^[a-z]+$/, { invert: true });
invertedSchema.validate('lowercase'); // ValidationError: "value" with value "lowercase" matches the inverted pattern: [a-z]
const invertedNamedSchema = Joi.string().pattern(/^[a-z]+$/, { name: 'alpha', invert: true });
invertedNamedSchema.validate('lowercase'); // ValidationError: "value" with value "lowercase" matches the inverted alpha patternВозможные ошибки валидации: string.pattern.base, string.pattern.invert.base, string.pattern.invert.name, string.pattern.name
string.replace(pattern, replacement)
Заменяет символы, соответствующие заданному шаблону, указанной строкой замены, где:
-
pattern- объект регулярного выражения для сопоставления или строка, все вхождения которой будут заменены. -
replacement- строка, которая заменит шаблон.
const schema = Joi.string().replace(/b/gi, 'x');
await schema.validateAsync('abBc'); // return value will be 'axxc'Когда pattern является строкой, все её вхождения будут заменены.
string.token()
Требуется, чтобы строковое значение содержало только символы a-z, A-Z, 0-9 и подчеркивание _.
const schema = Joi.string().token();Возможные ошибки валидации: string.token
string.trim([enabled])
Требуется, чтобы строковое значение не содержало пробелов до или после. Если опция валидации convert включена (по умолчанию включена), строка будет обрезанна.
Параметры:
-
enabled- необязательный параметр, по умолчаниюtrue, позволяющий сбросить поведение обрезки, задав ложное значение.
const schema = Joi.string().trim();
const schema = Joi.string().trim(false); // disable trim flagВозможные ошибки валидации: string.trim
string.truncate([enabled])
Определяет, следует ли использовать ограничение string.max() в качестве обрезки.
Параметры:
-
enabled- необязательный параметр, по умолчаниюtrue, позволяющий сбросить поведение обрезки, задав ложное значение.
const schema = Joi.string().max(5).truncate();
string.uppercase()
Требуется, чтобы строковое значение было в верхнем регистре. Если опция валидации convert включена (по умолчанию включена), строка будет принудительно преобразована в верхний регистр.
const schema = Joi.string().uppercase();Возможные ошибки валидации: string.uppercase
string.uri([options])
Требуется, чтобы строковое значение было допустимым URI в соответствии с RFC 3986.
-
options- необязательные настройки:-
scheme- Указывает одну или несколько допустимых схем, должна содержать только имя схемы. Может быть массивом или строкой (строки автоматически экранируются для использования в регулярном выражении). -
allowRelative- Разрешить относительные URI. По умолчаниюfalse. -
relativeOnly- Разрешить только относительные URI. По умолчаниюfalse. -
allowQuerySquareBrackets- Разрешить некодированные квадратные скобки внутри строки запроса. Это НЕ соответствует RFC 3986, но строки запроса, такие какabc[]=123&abc[]=456, очень распространены в наши дни. По умолчаниюfalse. -
domain- Проверить компонент домена с помощью опций, указанных вstring.domain().
-
// Accept git or git http/https
const schema = Joi.string().uri({
scheme: [
'git',
/git\+https?/
]
});Возможные ошибки валидации: string.uri, string.uriCustomScheme, string.uriRelativeOnly, string.domain
symbol
Генерирует объект схемы, соответствующий типу данных Symbol.
Если опция валидации convert включена (по умолчанию включена), будут проверены соответствия, заданные в map().
Поддерживает те же методы, что и тип any().
const schema = Joi.symbol().map({ 'foo': Symbol('foo'), 'bar': Symbol('bar') });
await schema.validateAsync('foo');Возможные ошибки валидации: symbol.base
symbol.map(map)
Разрешает преобразование значений в Symbol, где:
-
map- объявление отображения, которое может быть:- объектом, где ключи являются строками, а значения —
Symbol - массивом массивов длиной 2, где для каждого подмассива первый элемент должен быть любым, кроме объекта, функции или
Symbol, а второй элемент — символом - символом, следуя тем же принципам, что и массив выше
- объектом, где ключи являются строками, а значения —
const schema = Joi.symbol().map([
[1, Symbol('one')],
['two', Symbol('two')]
]);Возможные ошибки валидации: symbol.map
Расширения
Перед созданием собственных расширений полезно понять, как обрабатываются входные значения. Когда вызывается validate(), Joi выполняет следующие действия:
- Генерирует новую схему, если текущая содержит правила динамического построения, такие как
when()илиlink(). - Объединяет опции валидации с опциями, переданными через
any.prefs(). - Возвращает результат, если кеширование включено и входное значение найдено в кэше.
- Выполняет метод
prepare, определенный ниже. Если возвращается ошибка валидации, процесс прерывается независимо отabortEarly. - Приводит входное значение с помощью метода
coerce, определенного ниже, еслиconvertвключено. Если возвращается ошибка валидации, процесс прерывается независимо отabortEarly. - Если входное значение соответствует схеме, переданной в
any.empty(), оно преобразуется вundefined. - Проверяет присутствие.
- Проверяет допустимые/валидные/невалидные значения.
- Выполняет базовая валидацию с помощью метода
validate, определенного ниже. Если возвращается ошибка валидации, процесс прерывается независимо отabortEarly. - Выполняет правила валидации.
Обратите внимание, что расширение схем не меняет порядок, в котором Joi выполняет вышеперечисленные шаги
Метод extend() добавляет пользовательские типы в joi. Расширения могут быть:
- объектом расширения.
- функцией-фабрикой, генерирующей объект расширения.
Где:
-
type: Тип схемы. Может быть строкой или регулярным выражением, соответствующим нескольким типам. -
base: Базовая схема, от которой следует расширяться. Этот ключ запрещен, когдаtypeявляется регулярным выражением. -
messages: Хэш кодов ошибок и их сообщений. Для интерполяции динамических значений используйте синтаксис шаблонов. -
flags: Хэш имен флагов и их определений, где:-
default: Значение флага по умолчанию. Когда вызываетсяdescribe(), и текущий флаг совпадает с этим значением по умолчанию, он будет полностью опущен из описания.
-
-
prepare: Функция с сигнатуройfunction (value, helpers) {}, которая подготавливает входное значение (например, преобразует,в., чтобы поддерживать несколько десятичных представлений), где:-
value: Входное значение. -
helpers: Справочные инструменты валидации
Должна возвращать объект с одним из следующих ключей:
-
value: Изменённое значение. -
errors: Ошибка(и) валидации, сгенерированные$_createError()илиhelpers.error().
Если
errorsопределено, валидация прерывается независимо отabortEarly. Дополнительную информацию см. в процессе валидации выше. -
-
coerce: Функция с сигнатуройfunction (value, helpers) {}, которая приводит входное значение в соответствие, где:-
value: Входное значение. -
helpers: Справочные инструменты валидации
Вы также можете передать объект, где:
-
from: Тип(ы) для преобразования. Может быть одной строкой или массивом строк. Joi запуститmethodтолько если значениеtypeofвходного значения равно одному из предоставленных значений. -
method: Функция с сигнатуройfunction (value, helpers), которая приводит входное значение в соответствие, где:-
value: Входное значение. -
helpers: Справочные инструменты валидации
-
Должна возвращать объект с одним из следующих ключей:
-
value: Изменённое значение. -
errors: Ошибка(и) валидации, сгенерированные$_createError()илиhelpers.error().
Если
errorsопределено, валидация прерывается независимо отabortEarly. Дополнительную информацию см. в процессе валидации выше. -
-
validate: Функция с сигнатуройfunction (value, helpers) {}, которая выполняет базовую валидацию входного значения, где:-
value: Входное значение. -
helpers: Справочные инструменты валидации
Должна возвращать объект с одним из следующих ключей:
-
value: Изменённое значение. -
errors: Ошибка(и) валидации, сгенерированные$_createError()илиhelpers.error().
Если
errorsопределено, валидация прерывается независимо отabortEarly. Дополнительную информацию см. в процессе валидации выше. -
-
rules: Хэш имён правил валидации и их реализации, где:-
alias: Псевдонимы правила. Может быть строкой или массивом строк. -
args: Массив имён аргументов или объект, определяющий параметры, которые примет правило, где:-
name: Имя аргумента. -
ref: Разрешает ли этот аргумент ссылки. Joi разрешит их перед передачей вvalidate. По умолчаниюfalse. -
assert: Функция с сигнатуройfunction (value) {}, которая проверяет аргумент, возвращая булево значение. Также принимает схему Joi. Этот ключ обязателен, еслиrefустановлено вtrue. -
normalize: Функция с сигнатуройfunction (value) {}, которая нормализует аргумент перед передачей вassert. -
message: Сообщение, которое нужно выбросить, еслиassertявляется функцией. Этот ключ запрещён, еслиassertявляется схемой.
-
-
convert: Является ли это двойным правилом, которое преобразует входное значение и проверяет его одновременно. По умолчаниюfalse. -
manifest: Должно ли это правило отображаться в описании схемы. По умолчаниюtrue. -
method: Метод, который будет добавлен к экземпляру схемы. Полезно, когда вам нужно устанавливать флаги. Если установлено вundefined, Joi по умолчанию будет использовать функцию, которая при вызове добавит правило в очередь правил. Если установлено вfalse, метод не будет добавлен к экземпляру. -
multi: Может ли это правило вызываться несколько раз. По умолчаниюfalse. -
validate: Функция с сигнатуройfunction (value, helpers, args, rule), которая проверяет входное значение, где:-
value: Входное значение. -
helpers: Справочные инструменты валидации -
args: Разрешённые и проверенные аргументы, сопоставленные по их именам. -
rule: Определения правил, переданные в$_addRule, оставлены без изменений. Полезно, если вам нужен доступ к исходным аргументам перед валидацией.
-
-
-
overrides: Хэш имён методов и их переопределённой реализации. Для ссылки на родительский метод используйте$_parent().
const Joi = require('joi');
const custom = Joi.extend((joi) => {
return {
type: 'million',
base: joi.number(),
messages: {
'million.base': '{{#label}} must be at least a million',
'million.big': '{{#label}} must be at least five millions',
'million.round': '{{#label}} must be a round number',
'million.dividable': '{{#label}} must be dividable by {{#q}}'
},
coerce(value, helpers) {
// Only called when prefs.convert is true
if (helpers.schema.$_getRule('round')) {
return { value: Math.round(value) };
}
},
validate(value, helpers) {
// Base validation regardless of the rules applied
if (value < 1000000) {
return { value, errors: helpers.error('million.base') };
}
// Check flags for global state
if (helpers.schema.$_getFlag('big') &&
value < 5000000) {
return { value, errors: helpers.error('million.big') };
}
},
rules: {
big: {
alias: 'large',
method() {
return this.$_setFlag('big', true);
}
},
round: {
convert: true, // Dual rule: converts or validates
method() {
return this.$_addRule('round');
},
validate(value, helpers, args, options) {
// Only called when prefs.convert is false (due to rule convert option)
if (value % 1 !== 0) {
return helpers.error('million.round');
}
}
},
dividable: {
multi: true, // Rule supports multiple invocations
method(q) {
return this.$_addRule({ name: 'dividable', args: { q } });
},
args: [
{
name: 'q',
ref: true,
assert: (value) => typeof value === 'number' && !isNaN(value),
message: 'must be a number'
}
],
validate(value, helpers, args, options) {
if (value % args.q === 0) {
return value; // Value is valid
}
return helpers.error('million.dividable', { q: args.q });
}
},
even: {
method() {
// Rule with only method used to alias another rule
return this.dividable(2);
}
}
}
};
});
const schema = custom.object({
a: custom.million().round().dividable(Joi.ref('b')),
b: custom.number(),
c: custom.million().even().dividable(7),
d: custom.million().round().prefs({ convert: false }),
e: custom.million().large()
});Справочные инструменты валидации
-
original: Исходное значение, переданное без изменений вvalidate(). -
prefs: Подготовленные параметры валидации. -
schema: Ссылка на текущую схему. Полезно, если вам нужно использовать какие-либо из Расширенные функции. -
state: Текущее состояние валидации. См. Состояние валидации. -
error: Функция с сигнатуройfunction (code, local, localState = currentState) {}, похожая на$_createError(), но с текущим значением, параметрами валидации, переданным текущим состоянием, где:-
code: Код ошибки. -
local: Локальный контекст, используемый для интерполяции сообщения. -
localState: Локализованное состояние.
-
-
errorsArray: Функция, которая создаёт массив, который может быть распознан Joi как допустимый массив ошибок. **Обратите внимание, что использование обычного массива JavaScript может привести к некорректным результатам Joi.** -
warn: TODO -
message: TODO
Состояние валидации
Состояние валидации — это объект, содержащий информацию о процессе валидации, такую как текущее имя ключа значения и его предков. Поддерживаются следующие методы:
-
localize(): TODO -
nest(): TODO -
shadow(): TODO -
snapshot(): TODO -
restore(): TODO
Расширенные функции
$_root
Ссылка на текущий экземпляр Joi. Полезно, когда вам нужен доступ к **расширенному экземпляру**, а не к модулю Joi по умолчанию.
$_parent(method, ...args)
Вызывает исходный метод перед переопределением, аналогично super.method() при переопределении методов класса, где:
-
method: Название родительского метода. -
...args: Аргументы, переданные непосредственно родительскому методу.
$_temp
TODO
$_terms
TODO
$_addRule(options)
Добавляет правило в очередь правил, где:
-
options: Строка имени правила или параметры правила, где:-
name: Имя правила. -
args: Аргументы для обработки. -
method: Имя другого правила для повторного использования.
Вы также можете передать дополнительные свойства, которые будут доступны в аргументе
ruleметодаvalidate. -
$_compile(schema, options)
Компилирует литеральное определение схемы в объект Joi-схемы, где:
-
schema: Схема для компиляции. -
options: TODO
$_createError(code, value, local, state, prefs, options)
Создаёт ошибку валидации Joi, где:
-
code: Код ошибки. -
value: Текущее значение, проверяемое на валидность. -
local: Локальный контекст, используемый для интерполяции сообщения. -
state: Состояние валидации. -
prefs: Подготовленные параметры валидации. -
options: Параметры ошибки. TODO
$_getFlag(name)
Получает флаг с именем name.
$_getRule(name)
Получает единственное (multi установлено в false) правило с именем name.
$_mapLabels(path)
TODO
$_match(value, state, prefs, overrides)
TODO
$_modify(options)
TODO
$_mutateRebuild()
TODO
$_mutateRegister(schema, options)
TODO
$_property(name)
TODO
$_reach(path)
TODO
$_rootReferences()
TODO
$_setFlag(name, value, options)
Устанавливает флаг, где:
-
name: Имя флага для установки. -
value: Значение, на которое устанавливается флаг. -
options: Необязательные параметры, где:-
clone: Нужно ли клонировать схему. По умолчаниюtrue. Устанавливается вfalseтолько если схема уже была клонирована ранее.
-
$_validate(value, state, prefs)
Выполняет валидацию по отношению к текущей схеме без дополнительной нагрузки по объединению параметров валидации с набором значений по умолчанию, где:
-
value: Входное значение для валидации. -
state: Состояние валидации -
prefs: Подготовленные параметры валидации.
Используйте этот метод для выполнения валидации вложенных схем вместо validate()
Ошибки
ValidationError
joi выбрасывает или возвращает объекты ValidationError, содержащие:
-
name-'ValidationError'. -
isJoi-true. -
details- массив ошибок:-
message- строка с описанием ошибки. -
path- упорядоченный массив, где каждый элемент — аксессор к значению, в котором произошла ошибка. -
type- тип ошибки. -
context- объект, предоставляющий контекст ошибки, содержащий:-
key- ключ значения, которое вызвало ошибку, эквивалентный последнему элементуdetails.path. -
label- метка значения, которое вызвало ошибку, илиkey, если есть, или значение по умолчаниюmessages.root. -
value- значение, которое не прошло валидацию. - другие свойства, специфичные для кода ошибки, как описано для каждого кода ошибки.
-
-
-
annotate()- функция, которая возвращает строку с аннотированной версией объекта, указывающей на места возникновения ошибок. Принимает необязательный параметр, который, если он имеет истинное значение, удалит цвета из вывода.
Список ошибок
alternatives.all
Значение не соответствует всем альтернативным схемам.
alternatives.any
Альтернатива не найдена для проверки входных данных из-за критериев попытки.
alternatives.match
Альтернатива не подошла к входным данным из-за определённых правил сопоставления по крайней мере для одной из альтернатив.
Дополнительные свойства локального контекста:
{
details: Array<object>, // An array of details for each error found while trying to match to each of the alternatives
message: string // The combined error messages
}
alternatives.one
Значение соответствовало более чем одной альтернативной схеме.
alternatives.types
Предоставленные входные данные не соответствовали ни одному из разрешённых типов.
Дополнительные свойства локального контекста:
{
types: Array<string> // The list of expected types
}
any.custom
Пользовательский метод валидации выбросил исключение.
Дополнительные свойства локального контекста:
{
error: Error // The error thrown
}
any.default
Если ваша функция-генератор any.default() выбросит ошибку, она будет здесь.
Дополнительные свойства локального контекста:
{
error: Error // Error generated during the default value function call
}
any.failover
Если ваша функция-генератор any.failover() выбросит ошибку, она будет здесь.
Дополнительные свойства локального контекста:
{
error: Error // Error generated during the failover value function call
}
any.invalid
Значение соответствовало значению, указанному в недопустимых значениях.
Дополнительные свойства локального контекста:
{
invalids: Array<any> // Contains the list of the invalid values that should be rejected
}
any.only
Разрешены были только некоторые значения, входные данные не соответствовали ни одному из них.
Дополнительные свойства локального контекста:
{
valids: Array<any> // Contains the list of the valid values that were expected
}
any.ref
Ссылка использовалась в аргументе правила, и значение, на которое указывает эта ссылка во входных данных, не является допустимым.
Дополнительные свойства локального контекста:
{
arg: string, // The argument name
reason: string, // The reason the referenced value is invalid
ref: Reference // Reference used
}
any.required
Необходимое значение отсутствовало.
any.unknown
Значение присутствовало, хотя оно не ожидалось.
array.base
Значение не является массивом или не может быть преобразовано в массив из строки.
array.excludes
Массив содержит значение, которое входит в список исключений.
Дополнительные свойства локального контекста:
{
pos: number // Index where the value was found in the array
}
array.includesRequiredBoth
Ожидались некоторые значения в массиве, но они отсутствуют. Эта ошибка возникает, когда у нас есть смесь помеченных и непомеченных схем.
Дополнительные свойства локального контекста:
{
knownMisses: Array<string>, // Labels of all the missing values
unknownMisses: number // Count of missing values that didn't have a label
}
array.includesRequiredKnowns
Ожидались некоторые значения в массиве, но они отсутствуют. Эта ошибка возникает, когда у нас есть только помеченные схемы.
Дополнительные свойства локального контекста:
{
knownMisses: Array<string> // Labels of all the missing values
}
array.includesRequiredUnknowns
Ожидались некоторые значения в массиве, но они отсутствуют. Эта ошибка возникает, когда у нас есть только непомеченные схемы.
Дополнительные свойства локального контекста:
{
unknownMisses: number // Count of missing values that didn't have a label
}
array.includes
Значение не соответствовало ни одному из разрешённых типов для этого массива.
Дополнительные свойства локального контекста:
{
pos: number // Index where the value was found in the array
}
array.length
Массив не имеет ожидаемой длины.
Дополнительные свойства локального контекста:
{
limit: number // Length that was expected for this array
}
array.max
В массиве больше элементов, чем разрешено.
Дополнительные свойства локального контекста:
{
limit: number // Maximum length that was expected for this array
}
array.min
В массиве меньше элементов, чем требуется.
Дополнительные свойства локального контекста:
{
limit: number // Minimum length that was expected for this array
}
array.orderedLength
Для заданного array.ordered() в массиве больше элементов, чем нужно.
Дополнительные свойства локального контекста:
{
pos: number, // Index where the value was found in the array
limit: number // Maximum length that was expected for this array
}
array.sort
Массив не соответствует требуемому порядку сортировки.
Дополнительные свойства локального контекста:
{
order: string, // 'ascending' or 'descending'
by: string // The object key used for comparison
}
array.sort.mismatching
Сортировка массива не удалась из-за несовпадающих типов элементов.
array.sort.unsupported
Сортировка массива не удалась из-за неподдерживаемых типов элементов.
Дополнительные свойства локального контекста:
{
type: string // The unsupported array item type
}
array.sparse
Найдено значение undefined, которое не должно быть разрешено в массиве.
Дополнительные свойства локального контекста:
{
pos: number // Index where an undefined value was found in the array
}
array.unique
Найдено дублирующееся значение в массиве.
Дополнительные свойства локального контекста:
{
pos: number, // Index where the duplicate value was found in the array
dupePos: number, // Index where the first appearance of the duplicate value was found in the array
dupeValue: any // Value with which the duplicate was met
}
array.hasKnown
Схема в array.has() не найдена в массиве. Эта ошибка возникает, когда схема помечена.
Дополнительные свойства локального контекста:
{
patternLabel: string // Label of assertion schema
}
array.hasUnknown
Схема в array.has() не найдена в массиве. Эта ошибка возникает, когда схема не помечена.
binary.base
Значение не является буфером или не может быть преобразовано в буфер из строки.
binary.length
Буфер не имеет указанной длины.
Дополнительные свойства локального контекста:
{
limit: number // Length that was expected for this buffer
}
binary.max
Буфер содержит больше байтов, чем ожидалось.
Дополнительные свойства локального контекста:
{
limit: number // Maximum length that was expected for this buffer
}
binary.min
Буфер содержит меньше байтов, чем ожидалось.
Дополнительные свойства локального контекста:
{
limit: number // Minimum length that was expected for this buffer
}
boolean.base
Значение не является булевым или не может быть преобразовано в булево значение из истинного или ложного значения.
date.base
Значение не является датой или не может быть преобразовано в дату из строки или числа.
date.format
Дата не соответствует требуемому формату.
Дополнительные свойства локального контекста:
{
format: string // The required format
}
date.greater
Дата превышает установленный вами предел.
Дополнительные свойства контекста локальной области:
{
limit: Date // Maximum date
}
date.less
Дата находится ниже установленного вами предела.
Дополнительные свойства контекста локальной области:
{
limit: Date // Minimum date
}
date.max
Дата превышает или равна установленному вами пределу.
Дополнительные свойства контекста локальной области:
{
limit: Date // Maximum date
}
date.min
Дата меньше или равна установленному вами пределу.
Дополнительные свойства контекста локальной области:
{
limit: Date // Minimum date
}
date.strict
Возникает, когда входной параметр не является типом Date и convert отключен.
function.arity
Количество аргументов функции не соответствует необходимому количеству.
Дополнительные свойства контекста локальной области:
{
n: number // Expected arity
}
function.class
Входной параметр не является JavaScript классом.
function.maxArity
Количество аргументов функции превышает необходимое количество.
Дополнительные свойства контекста локальной области:
{
n: number // Maximum expected arity
}
function.minArity
Количество аргументов функции меньше необходимого количества.
Дополнительные свойства контекста локальной области:
{
n: number // Minimum expected arity
}
number.base
Значение не является числом или не может быть преобразовано в число.
number.greater
Число меньше или равно установленному вами пределу.
Дополнительные свойства контекста локальной области:
{
limit: number // Minimum value that was expected for this number
}
number.infinity
Число равно Infinity или -Infinity.
number.integer
Число не является допустимым целым числом.
number.less
Число больше или равно установленному вами пределу.
Дополнительные свойства контекста локальной области:
{
limit: number // Maximum value that was expected for this number
}
number.max
Число больше установленного вами предела.
Дополнительные свойства контекста локальной области:
{
limit: number // Maximum value that was expected for this number
}
number.min
Число меньше установленного вами предела.
Дополнительные свойства контекста локальной области:
{
limit: number // Minimum value that was expected for this number
}
number.multiple
Число нельзя было разделить на указанное вами кратное.
Дополнительные свойства контекста локальной области:
{
multiple: number // The number of which the input is supposed to be a multiple of
}
number.negative
Число было положительным.
number.port
Число не похоже на номер порта.
number.positive
Число было отрицательным.
number.precision
Число не имело требуемой точности.
Дополнительные свойства контекста локальной области:
{
limit: number // The precision that it should have had
}
number.unsafe
Число не находится в безопасном диапазоне JavaScript-чисел.
object.unknown
В объекте было найдено неожиданное свойство.
Дополнительные свойства контекста локальной области:
{
child: string // Property that is unexpected
}
object.and
В указанном объекте не было выполнено условие И между свойствами, которые вы указали.
Дополнительные свойства контекста локальной области:
{
present: Array<string>, // List of properties that are set
presentWithLabels: Array<string>, // List of labels for the properties that are set
missing: Array<string>, // List of properties that are not set
missingWithLabels: Array<string> // List of labels for the properties that are not set
}
object.assert
Схема в object.assert() не прошла проверку.
Дополнительные свойства контекста локальной области:
{
subject: object, // The assertion subject. When it is a reference, use subject.key for the display path.
message: string // Custom message when provided
}
object.base
Значение не имеет ожидаемого типа.
Дополнительные свойства контекста локальной области:
{
type: string // The expected type
}
object.length
Количество ключей для этого объекта не соответствует ожидаемой длине.
Дополнительные свойства контекста локальной области:
{
limit: number // Number of keys that was expected for this object
}
object.max
Количество ключей для этого объекта превышает или равно установленному вами пределу.
Дополнительные свойства контекста локальной области:
{
limit: number // Maximum number of keys
}
object.min
Количество ключей для этого объекта меньше или равно установленному вами пределу.
Дополнительные свойства контекста локальной области:
{
limit: number // Minimum number of keys
}
object.missing
В указанном объекте не было выполнено условие ИЛИ или ИСКЛЮЧАЮЩЕЕ ИЛИ между свойствами, которые вы указали, ни одно из них не было установлено.
Дополнительные свойства контекста локальной области:
{
peers: Array<string>, // List of properties where none of them were set
peersWithLabels: Array<string> // List of labels for the properties where none of them were set
}
object.nand
В указанном объекте не было выполнено условие НЕ-И между свойствами, которые вы указали.
Дополнительные свойства контекста локальной области:
{
main: string, // One of the properties that was present
mainWithLabel: string, // The label of the `main` property
peers: Array<string>, // List of the other properties that were present
peersWithLabels: Array<string> // List of the labels of the other properties that were present
}
object.pattern.match
Ключи объекта не соответствуют требованиям совпадения шаблона.
Дополнительные свойства контекста локальной области:
{
details: Array<object>, // An array of details for each error found while trying to match to each of the alternatives
message: string, // The combined error messages
matches: Array<string> // The matching keys
}
object.refType
Объект не является Joi.ref().
object.regex
Объект не является объектом RegExp.
object.rename.multiple
Переименование уже было выполнено для того же целевого свойства.
Дополнительные свойства контекста локальной области:
{
from: string, // Origin property name of the rename
to: string, // Target property of the rename
pattern: boolean // Indicates if the rename source was a pattern (regular expression)
}
object.rename.override
Целевое свойство уже существует, и вы запретили перезапись.
Дополнительные свойства контекста локальной области:
{
from: string, // Origin property name of the rename
to: string, // Target property of the rename
pattern: boolean // Indicates if the rename source was a pattern (regular expression)
}
object.schema
Объект не был схемой joi.
Дополнительные свойства контекста локальной области:
{
type: string // The required schema
}
object.instance
Объект не является того типа, который вы указали.
Дополнительные свойства контекста локальной области:
{
type: string // Type name the object should have been
}
object.with
Отсутствовало свойство, которое должно было присутствовать одновременно с другим.
Дополнительные свойства контекста локальной области:
{
main: string, // Property that triggered the check
mainWithLabel: string, // Label of the property that triggered the check
peer: string, // Property that was missing
peerWithLabels: string // Label of the other property that was missing
}
object.without
Присутствовало свойство, которое должно было отсутствовать одновременно с другим.
Дополнительные свойства контекста локальной области:
{
main: string, // Property that triggered the check
mainWithLabel: string, // Label of the property that triggered the check
peer: string, // Property that was present
peerWithLabels: string // Label of the other property that was present
}
object.xor
Условие ИСКЛЮЧАЮЩЕЕ ИЛИ между свойствами, которые вы указали, не было выполнено в этом объекте.
Дополнительные свойства контекста локальной области:
{
peers: Array<string>, // List of properties where none of it or too many of it was set
peersWithLabels: Array<string> // List of labels for the properties where none of it or too many of it was set
}
object.oxor
Необязательное условие ИСКЛЮЧАЮЩЕЕ ИЛИ между свойствами, которые вы указали, не было выполнено в этом объекте.
Дополнительные свойства контекста локальной области:
{
peers: Array<string>, // List of properties where too many of it was set
peersWithLabels: Array<string> // List of labels for the properties where too many of it was set
}
string.alphanum
Строка содержит не только буквенно-цифровые символы.
string.base64
Строка не является допустимой строкой base64.
string.base
Входной параметр не является строкой.
string.creditCard
Строка не является допустимым номером кредитной карты.
string.dataUri
Строка не является допустимой строкой URI данных.
string.domain
Строка не является допустимым именем домена.
string.email
Строка не является допустимым адресом электронной почты.
Дополнительные свойства контекста локальной области:
{
invalids: [string] // Array of invalid emails
}
string.empty
Найдена пустая строка, которая запрещена недопустимыми значениями.
string.guid
Строка не является допустимым GUID.
string.hexAlign
Строка содержит шестнадцатеричные символы, но они не выровнены по байтам.
string.hex
Строка не является допустимой шестнадцатеричной строкой.
string.hostname
Строка не является допустимым именем хоста.
string.ipVersion
Строка не является допустимым IP-адресом, учитывая предоставленные ограничения.
Дополнительные свойства контекста локальной области:
{
cidr: string, // CIDR used for the validation
version: Array<string> // List of IP version accepted
}
string.ip
Строка не является допустимым IP-адресом.
Дополнительные свойства контекста локальной области:
{
cidr: string // CIDR used for the validation
}
string.isoDate
Строка не является допустимой строкой даты в формате ISO.
string.isoDuration
Строка должна быть допустимой продолжительностью ISO 8601.
string.length
Строка не имеет ожидаемой длины.
Дополнительные свойства контекста локальной области:
{
limit: number, // Length that was expected for this string
encoding: undefined | string // Encoding specified for the check if any
}
string.lowercase
Строка не является полностью строчными буквами.
string.max
Строка длиннее ожидаемой.
Дополнительные свойства контекста локальной области:
{
limit: number, // Maximum length that was expected for this string
encoding: undefined | string // Encoding specified for the check if any
}
string.min
Строка короче ожидаемой.
Дополнительные свойства контекста локальной области:
{
limit: number, // Minimum length that was expected for this string
encoding: undefined | string // Encoding specified for the check if any
}
string.normalize
Строка недействительна с точки зрения ожидаемой формы нормализации.
Дополнительные свойства контекста локальной области:
{
form: string // Normalization form that is expected
}
string.pattern.base
Строка не соответствовала регулярному выражению.
Дополнительные свойства контекста локальной области:
{
name: undefined, // Undefined since the regular expression has no name
pattern: string // Regular expression
}
string.pattern.name
Строка не соответствовала именованному регулярному выражению.
Дополнительные свойства контекста локальной области:
{
name: string, // Name of the regular expression
pattern: string // Regular expression
}
string.pattern.invert.base
Строка соответствовала регулярному выражению, хотя этого не должно было быть.
Дополнительные свойства контекста локальной области:
{
name: undefined, // Undefined since the regular expression has no name
pattern: string // Regular expression
}
string.pattern.invert.name
Строка соответствовала именованному регулярному выражению, в то время как этого не должно было быть.
Дополнительные свойства локального контекста:
{
name: string, // Name of the regular expression
pattern: string // Regular expression
}
string.token
Строка не является токеном.
string.trim
Строка содержит пробелы вокруг неё.
string.uppercase
Строка не состоит целиком из заглавных букв.
string.uri
Строка не является допустимым URI.
string.uriCustomScheme
Строка не является допустимым URI с учётом пользовательских схем.
Дополнительные свойства локального контекста:
{
scheme: string // Scheme prefix that is expected in the URI
}
string.uriRelativeOnly
Строка является допустимым относительным URI.
symbol.base
Входное значение не является символом.
symbol.map
Входное значение не является символом или не может быть преобразовано в символ.
Copyright © 2012-2022, Project contributors Copyright © 2012-2022, Sideway Inc Copyright © 2012-2014, Walmart
Licensed under the BSD 3-clause License.
https://joi.dev/api/?v=17.11.0