Ошибки
При проверке неизвестных данных на соответствие схеме Valibot собирает информацию о каждой ошибке. Если обнаружена хотя бы одна ошибка, они возвращаются в массиве. Каждая ошибка содержит подробную информацию, которая поможет вам или вашим пользователям устранить проблему.
Информация об ошибке
Одна ошибка соответствует приведённому ниже определению типа TypeScript.
type BaseIssue = {
// Required info
kind: 'schema' | 'validation' | 'transformation';
type: string;
input: unknown;
expected: string | null;
received: string;
message: string;
// Optional info
requirement?: unknown;
path?: IssuePath;
issues?: Issues;
lang?: string;
abortEarly?: boolean;
abortPipeEarly?: boolean;
skipPipe?: boolean;
};
Обязательная информация
Каждая ошибка содержит следующую обязательную информацию.
Вид
kind описывает вид проблемы. Если входные данные не соответствуют типу данных, например, вместо строки передано число, kind имеет значение 'schema'. Во всех остальных случаях причина заключается не в типе данных, а в их фактическом содержимом. Например, если строка недопустима, потому что не соответствует регулярному выражению, kind имеет значение 'validation'.
Тип
type описывает, какая функция выполнила проверку. Если функция схемы array обнаруживает, что входные данные не являются массивом, type имеет значение 'array'. Если функция проверки minLength обнаруживает, что массив слишком короткий, type имеет значение 'min_length'.
Входные данные
input содержит входные данные, в которых обнаружена ошибка. Для сложных данных, например объектов, input содержит значение соответствующего ключа, не соответствующее схеме.
Ожидаемое значение
expected — это языконезависимая строка, описывающая ожидаемое свойство данных. Её можно использовать для создания понятных сообщений об ошибках. Если ваши пользователи не являются разработчиками, вы можете заменить языконезависимые обозначения словами на нужном языке.
Полученное значение
received — это языконезависимая строка, описывающая полученное свойство данных. Её можно использовать для создания понятных сообщений об ошибках. Если ваши пользователи не являются разработчиками, вы можете заменить языконезависимые обозначения словами на нужном языке.
Сообщение
message содержит понятное человеку сообщение об ошибке, которое можно полностью настроить, как описано в нашем кратком руководстве и руководстве по интернационализации.
Необязательная информация
Некоторые ошибки содержат дополнительную необязательную информацию.
Требование
requirement может содержать дополнительные сведения о проверке. Например, если функция проверки minLength обнаруживает, что строка слишком короткая, requirement содержит минимальную длину этой строки.
Путь
path — это массив объектов, описывающий местоположение ошибки в сложных данных. Каждый элемент пути содержит следующую информацию.
Значение
inputэлемента пути может отличаться от значенияinputсоответствующей ошибки. Это связано с тем, что родительские схемы добавляют элементы пути последовательно, и эти элементы относятся к их входным данным. Преобразования дочерних схем при этом не учитываются.
type PathItem = {
type: string;
origin: 'key' | 'value';
input: unknown;
key?: unknown;
value: unknown;
};
Например, с помощью следующего кода можно создать путь с разделителями-точками.
import * as v from 'valibot';
const dotPath = v.getDotPath(issue);
Ошибки
issues возникают только при использовании union и содержат все ошибки схем объединённого типа.
Конфигурация
lang можно использовать в рамках нашей функции i18n, чтобы задать нужный язык. abortEarly и abortPipeEarly сообщают, что проверка была преждевременно прервана. Дополнительные сведения приведены в руководстве по разбору данных. Это все параметры конфигурации, которыми вы можете управлять самостоятельно.
Форматирование
Для распространённых задач, например проверки форм, Valibot включает небольшие встроенные функции для форматирования ошибок. Однако, поняв принцип их работы, вы легко сможете форматировать ошибки самостоятельно и приводить их к виду, подходящему для вашей задачи.
Сведение ошибок
Если вам нужны только сообщения об ошибках для отображения пользователям, можно преобразовать массив ошибок в плоский объект с помощью flatten. Ниже приведён пример.
import * as v from 'valibot';
const ObjectSchema = v.object({
foo: v.string('Value of "foo" is missing.'),
bar: v.object({
baz: v.string('Value of "bar.baz" is missing.'),
}),
});
const result = v.safeParse(ObjectSchema, { bar: {} });
if (result.issues) {
console.log(v.flatten<typeof ObjectSchema>(result.issues));
}
В result, возвращённом в приведённом выше фрагменте кода, содержатся следующие ошибки.
[
{
kind: 'schema',
type: 'string',
input: undefined,
expected: 'string',
received: 'undefined',
message: 'Value of "foo" is missing.',
path: [
{
type: 'object',
origin: 'value',
input: {
bar: {},
},
key: 'foo',
value: undefined,
},
],
},
{
kind: 'schema',
type: 'string',
input: undefined,
expected: 'string',
received: 'undefined',
message: 'Value of "bar.baz" is missing.',
path: [
{
type: 'object',
origin: 'value',
input: {
bar: {},
},
key: 'bar',
value: {},
},
{
type: 'object',
origin: 'value',
input: {},
key: 'baz',
value: undefined,
},
],
},
];
Однако с помощью flatten ошибки были преобразованы в следующий объект.
{
nested: {
foo: ['Value of "foo" is missing.'],
'bar.baz': ['Value of "bar.baz" is missing.'],
},
};
© Fabian Hiller
Licensed under the MIT License.
https://valibot.dev/guides/issues/