Spec-Zone.ru › Joi

Введение

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) - преобразует значение в число.

И следующие константы:

  • null
  • true
  • false

extend(...extensions)

Создаёт новый настроенный экземпляр модуля joi, где:

  • extensions - конфигурации расширений, как описано в Расширения.

Обратите внимание, что исходный модуль joi не изменяется этим.

in(ref, [options])

Создаёт ссылку, которая при разрешении используется как массив значений для сопоставления с правилом, где:

  • ref - то же, что и Joi.ref().
  • options - то же, что и Joi.ref().

Может использоваться только в правилах, которые поддерживают ссылки 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.
    • Строкой в точечной нотации, представляющей путь к элементу для проверки уникальности. Любой отсутствующий путь будет считаться неопределённым и может существовать только один раз.
  • 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'))
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API